Ist es möglich, die npgsql-Protokollausgabe an einen log4net-Logger umzuleiten? Aus dem Quellcode von npgsql sieht es so aus, als würde es direkt in stdout/stderr oder einer bestimmten Datei (unter Verwendung der statischen Eigenschaften unter NpgsqlEventLog
) loggen. Gibt es eine Möglichkeit, diese Protokollierung in log4net zu routen?Wie umleiten npgsql Log-Ausgabe zu einem log4net Logger?
Antwort
Ich weiß nichts über npgsql, aber wenn Sie die Quelle haben und dürfen es ändern, dann sollte es einfacher sein, es zu ändern, um log4net zu unterstützen.
Wenn Sie die Quelle nicht haben, dann wäre es nicht einfach und möglicherweise nicht einmal möglich. Da log4net die Ausgabe von anderen Quellen nicht abfängt, wäre die einzige Möglichkeit, dies zu tun, ein Hintergrund-Thread zu haben, der die Datei überwacht, für die npgsql ausgegeben wird, und wenn sich die Datei ändert, müssten Sie diese Datei lesen und analysieren Sie die Informationen und rufen Sie dann log4net mit diesen Informationen auf.
Sie haben immer noch das Problem, dass Log4net denkt, dass jeder Aufruf von Ihrer Routine kommt und nicht npgsql und Stack-Spuren durcheinander kommen. Würde auch nur funktionieren, wenn npgsql jedes Mal, wenn ein Protokolleintrag erstellt wurde, die Datei sperrt, öffnet, schreibt und schließt.
Erste log4net zu Ihrer Lösung hinzuzufügen, der einfache Weg ist nuget zu verwenden: so tun Sie dies: installieren-Paket log4net dann müssen Sie Npgsql installieren: installieren-Paket Npgsql
in Ihrem Web .config Datei Sie fügen diese Elemente hinzu: (Sie müssen App verwenden.Konfiguration für nicht Web-Lösung)
In der configSection printf ("% d \ n", 42);/*
//the most important thing is to ensure that the type on your parameter //section is correct. otherwise, no error will be returned, and no data will be inserted.
//now, at your code you can use this function:
protected void LogInfo(string message, params object[] args)
{
log4net.ILog log = log4net.LogManager.GetLogger("postgreSqlLogAppender");
log4net.ThreadContext.Properties["UserId"] = args.[0];
log4net.ThreadContext.Properties["EntityId"] = args.[1];
log.Info(string.Format("{0}: {1}", this.GetType().Name.Replace("Controller", ""), string.Format(message, args)));
log4net.ThreadContext.Properties.Remove("UserId");
log4net.ThreadContext.Properties.Remove("EntityId");
}
//to call your function
void test()
{
LogInfo("My message",15,326)
}
//in my case 15 is my current user_id and 326 is the my class_object.
*/
Dies ist, wie ich es getan habe und es scheint recht gut zu funktionieren. Beachten Sie, dass ich den Befehl am Aufspalten abzumelden an einen separaten appender, weil es ziemlich ausführliche bekommt ...
Zuerst diese hinzufügen, bevor Sie irgendwelche anderen Anrufe Npgsql machen:
NpgsqlLogManager.Provider = new Log4NetNpgsqlLoggingProvider("NpgsqlDefaultLogger")
{
CommandLoggerName = "NpgsqlCommandLogger"
};
Jetzt müssen Sie hinzufügen in der Logging-Provider-Klasse:
using System;
using Npgsql.Logging;
namespace Util.Npgsql
{
public class Log4NetNpgsqlLoggingProvider : INpgsqlLoggingProvider
{
public string DefaultLoggerName { get; }
public string CommandLoggerName { get; set; }
public Log4NetNpgsqlLoggingProvider(string defaultLoggerName)
{
if (defaultLoggerName == null) throw new ArgumentNullException(nameof(defaultLoggerName));
DefaultLoggerName = defaultLoggerName;
}
public NpgsqlLogger CreateLogger(string name)
{
switch (name)
{
case "Npgsql.NpgsqlCommand":
return new Log4NetNpgsqlLogger(CommandLoggerName ?? DefaultLoggerName);
default:
return new Log4NetNpgsqlLogger(DefaultLoggerName);
}
}
}
}
Und Sie müssen auch die tatsächliche Logger Klasse:
using System;
using log4net;
using log4net.Core;
using Npgsql.Logging;
namespace Util.Npgsql
{
public class Log4NetNpgsqlLogger : NpgsqlLogger
{
private readonly ILog _log;
public Log4NetNpgsqlLogger(string name)
{
_log = LogManager.GetLogger(name);
}
public override bool IsEnabled(NpgsqlLogLevel level)
{
return _log.Logger.IsEnabledFor(GetLog4NetLevelFromNpgsqlLogLevel(level));
}
public override void Log(NpgsqlLogLevel level, int connectorId, string msg, Exception exception = null)
{
_log.Logger.Log(typeof(NpgsqlLogger), GetLog4NetLevelFromNpgsqlLogLevel(level), connectorId + ": " + msg, exception);
}
protected Level GetLog4NetLevelFromNpgsqlLogLevel(NpgsqlLogLevel level)
{
switch (level)
{
case NpgsqlLogLevel.Trace:
case NpgsqlLogLevel.Debug:
return Level.Debug;
case NpgsqlLogLevel.Info:
return Level.Info;
case NpgsqlLogLevel.Warn:
return Level.Warn;
case NpgsqlLogLevel.Error:
return Level.Error;
case NpgsqlLogLevel.Fatal:
return Level.Fatal;
default:
throw new Exception("Unknown Npgsql Log Level: " + level);
}
}
}
}
- 1. Log4Net: Mehrere Logger
- 2. Log4Net Mehrere Logger
- 3. Log4net: Logger Instanziierung
- 4. Log4net mehrere Logger - File Logger funktioniert nicht
- 5. Wie javax.mail.Session umleiten setDebugOut zu log4j Logger?
- 6. log4net-Strategie für named Logger?
- 7. Was ist der Root-Logger in log4net
- 8. Log4net auf IIS7,5 oder anderen Logger?
- 9. log4net: Wie wird der Logger-Dateiname dynamisch gesetzt?
- 10. C# Statisch Readonly log4net Logger, wie kann man den Logger im Unit Test ändern?
- 11. log4net: Logger dynamisch erstellen, sollte ich mich um irgendetwas kümmern?
- 12. Log4Net: Programmgesteuert mehrere Logger angeben (mit mehreren Dateiapplikatoren)
- 13. .Net Logger (Schreiben Sie Ihre eigenen vs log4net/Enterprise Logger/Nlog usw.)
- 14. Verwenden von log4net zum Schreiben in verschiedene Logger
- 15. Wie umleiten STDOUT zu einem NSTextView?
- 16. Unterschied zwischen Logger und Root-Ebene in log4Net?
- 17. Können Sie auf Logger-Ebene in log4net filtern
- 18. Wie protokolliert man Trace-Nachrichten mit log4net?
- 19. Add-ons zu Log4Net
- 20. Ist es möglich, Logger-Namen in der log4net-Konfiguration zu verwenden?
- 21. Singleton Logger, statischer Logger, Werkslogger ... wie logge?
- 22. einloggen log4net zu verschiedenen Appenders basierend auf den Umständen
- 23. Log4Net Konfiguration Log-Level
- 24. Log4Net dynamisch rekonfigurieren
- 25. log4net ohne app.config
- 26. wie Log4Net mit Autofac in CommonLibrary-Projekt zu verwenden
- 27. Subdomain umleiten zu einem anderen Server
- 28. Log4net ForwardingAppender Schwelle
- 29. Umleiten VxWorks Shell-Ausgang zu einem Sockel
- 30. umleiten stderr zu einem Puffer in c
beachten Sie auch, dass in Npgsql 3.2.0: "Npgsql benutzerdefinierte Protokollierung wurde mit [Microsoft.Extensions.Logging]" ersetzt. In 3.2.2 wurde es jedoch rückgängig gemacht: "Aufgrund der vielen Beschwerden wurde die Verwendung von Microsoft.Extensions.Logging durch Npgsql 3.2 gelöscht, und die Protokollierung funktioniert jetzt wie in Npgsql 3.1". Referenzen: https://github.com/npgsql/Npgsql/releases –