Laden...

In Server Client-IP loggen und filtern

Erstellt von Fabiano vor 2 Jahren Letzter Beitrag vor 2 Jahren 377 Views
F
Fabiano Themenstarter:in
27 Beiträge seit 2021
vor 2 Jahren
In Server Client-IP loggen und filtern

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!

2.298 Beiträge seit 2010
vor 2 Jahren

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 |

16.833 Beiträge seit 2008
vor 2 Jahren

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).

F
Fabiano Themenstarter:in
27 Beiträge seit 2021
vor 2 Jahren

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?

16.833 Beiträge seit 2008
vor 2 Jahren

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

F
Fabiano Themenstarter:in
27 Beiträge seit 2021
vor 2 Jahren

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...

16.833 Beiträge seit 2008
vor 2 Jahren

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.