Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
In Server Client-IP loggen und filtern
Fabiano
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

In Server Client-IP loggen und filtern

beantworten | zitieren | melden

Hallo zusammen!

Ich möchte in einem Server in Logmeldungen die Client-Ip mitloggen und analog zum LogLevel-Filter die Meldungen auf solche spezifischer Clients reduziern.
Also so wie ich das LogLevel von ERROR auf DEBUG stellen kann, möchte ich eine Liste von IPs konfiguriern, deren Logmeldungen geschrieben werden sollen, während alle anderen ignoriert werden.
Gibt es ein Loggingframework, das sowas bietet?

Vielen Dank für eure Antworten!
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2354

beantworten | zitieren | melden

LogLevel unterstützen denke ich alle vernünftigen Lösungen (z.B. Log4Net). Das Filtern bezüglich der IP-Adressen wirst du jedoch selbst implementieren müssen.
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15975

beantworten | zitieren | melden

Das führende Loggingframework in .NET ist derzeit serilog/serilog.
Das bietet Filter Expressions an, mit dem sich sowas umsetzen lässt.

Da Du von einem Server sprichst nehme ich einfach an, dass Du von ASP.NET sprichst, was ebenfalls eine direkte Unterstützung für Serilog hat (und umgekehrt).

PS: Logging funktioniert eigentlich konzeptionell so, dass man erst mal alles loggt.
Will man dann nur gewisse Clients haben, dann sollte man das in der View filtern (zB in einer entsprechenden Report Software).
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Fabiano
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

beantworten | zitieren | melden

Serilog schaut vielversprechend aus, aber ich kriege nicht einmal die Client IP geloggt. Ich habe:
1. Ein neues WebAPI-Projekt erstellt
2. Folgende Pakete installiert:
Serilog
Serilog.AspNetCore
Serilog.Enrichers.ClientInfo
Serilog.Sinks.Console
3. Folgende Dateien angepasst:
Program.cs

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Serilog;

namespace Tests.SerilogWeb
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder => {
                    webBuilder.UseStartup<Startup>();
                })
                .UseSerilog(new LoggerConfiguration() // Logger instanziern
                    .MinimumLevel.Debug()
                    .Enrich.WithClientIp()
                    .WriteTo.Console()
                    .CreateLogger()
                );
    }
}

Startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.OpenApi.Models;
using Serilog;

namespace Tests.SerilogWeb
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "Tests.SerilogWeb", Version = "v1" });
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment()) {
                app
                    .UseDeveloperExceptionPage()
                    .UseSwagger()
                    .UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Tests.SerilogWeb v1"));
            }
            app
                .UseSerilogRequestLogging() // <- Hinzugefügt
                .UseHttpsRedirection()
                .UseRouting()
                .UseAuthorization()
                .UseEndpoints(endpoints => {
                    endpoints.MapControllers();
                });
        }
    }
}
WeatherForecastController.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Tests.SerilogWeb.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            _logger.LogInformation("Hier sollte die ClientIp stehen: ->{ClientIp}<-");
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}


Geloggt wird aber der String ohne Ersetzung der IP, also
Hier sollte die ClientIp stehen: ->{ClientIp}<-
statt z.B.
Hier sollte die ClientIp stehen: ->192.168.1.42<-

Hat hier jemand eine Idee?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15975

beantworten | zitieren | melden

Und Du erwartest nun, dass Serilog mit hellseherischen Kräften ClientIp mit der IP ersetzt, oder wie?
Gibt halt die IP mit.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Fabiano
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

beantworten | zitieren | melden

Ja, das erwarte ich von Enrich.WithClientIp(), dass das die Variable hinzufügt.
Wozu ist denn das sonst gut? Nur damit ich das versteh, mein ich. Will hier niemanden kritisiern, nur hat der Entwickler das genauso angegeben, ausser dass er das Output Template setzt, was bei mir ebenfalls nicht funktioniert...
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15975

beantworten | zitieren | melden

Enrich.WithClientIp() hab ich gar nicht gesehen, mea culpa.

Was Du leider nicht beachtest hast ist, dass Du das Setup von Serilog nicht so umgesetzt hast, wie es richtig ist.
Wahrscheinlich funktioniert deshalb dein gesamten Setup nicht.

Mach es einfach, wie es in der Serilog Doku für, ASP.NET Core steht.

   .UseSerilog((context, services, configuration) => configuration
                    .ReadFrom.Configuration(context.Configuration)
                    .ReadFrom.Services(services)
                    .Enrich.FromLogContext()
                           .Enrich.WithClientIp()
                    .WriteTo.Console())
in ASP.NET Core muss man keinen statischen Logger definieren (außer für das Boostrapping selbst, zB. für Azure Diagnostic Log Stream).

Ansonsten ist das Projekt Open Source.
Im Zweifel ziehen und selbst debuggen.

Les Dir am besten die gesamte Doku durch (was Du in angetracht der Zeit zwischen den Posts eher nicht getan haben kannst :-), dann siehst auch, wie man das flexibel über eine Konfigurationsdatei umsetzen kann - und dass Logging viel Performance kosten kann.

Dann noch der Hinweis, dass in der EU eine IP Adresse unter dem Datenschutz des Nutzers liegt und Du daher diese nicht einfach so loggen darfst.
Du musst den User darüber in Kenntnis setzen, im Zweifel sein Einverständnis holen und laut Gesetz auch innerhalb einer Zeitspanne löschen musst.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers