Можно ли перенаправить выход журнала npgsql для входа в log4net logger? Из исходного кода npgsql он выглядит так, что он регистрируется непосредственно в stdout/stderr или указанном файле (используя статические свойства по NpgsqlEventLog
). Есть ли способ маршрутизации этого входа в log4net?Как перенаправить вывод журнала npgsql в журнал log4net?
ответ
Я ничего не знаю о npgsql, но если у вас есть источник и им разрешено его изменять, то должно быть легче изменить его для поддержки log4net.
Если у вас не было источника, это было бы нелегко и возможно даже невозможно. Поскольку log4net не перехватывает вывод из других источников, единственный способ, которым я мог это сделать, - это иметь фоновый поток, который контролирует файл, который выводит npgsql, и когда файл изменяется, вам нужно будет прочитать этот файл и проанализировать информацию, а затем вызвать log4net с этой информацией.
У вас все еще есть проблема, что log4net будет считать, что каждый вызов поступает из вашей подпрограммы, а не npgsql, и трассировки стека перепутаны. Также будет работать, только если npgsql блокирует, открывает, записывает и закрывает файл каждый раз, когда записывается запись в журнал.
Сначала добавьте log4net к вашему решению, легкий способ заключается в использовании NuGet: так что вы это сделать: установить-пакет log4net , то вы должны установить npgsql: установки-пакет npgsql
в вашей сети .config вы добавляете эти элементы: (вам нужно использовать приложение.config for not web solution)
В 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.
*/
Это, как я сделал это, и это, кажется, работает достаточно хорошо. Обратите внимание, что я расколоть команду выхода из системы в отдельный Appender, потому что он получает довольно многословен ...
Во-первых, добавьте это, прежде чем делать какие-либо другие вызовы в Npgsql:
NpgsqlLogManager.Provider = new Log4NetNpgsqlLoggingProvider("NpgsqlDefaultLogger")
{
CommandLoggerName = "NpgsqlCommandLogger"
};
Теперь нужно добавить в классе поставщика регистрации:
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);
}
}
}
}
И вы также должны фактический класс регистратора:
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 не записывает журнал
- 2. Как перенаправить вывод журнала AWS sdk
- 3. Log4Net журнал события полного
- 4. Log4net: журнал уникальных сообщений
- 5. Как перенаправить вывод команды времени в файл журнала?
- 6. Перенаправить вывод команды «puts» в файл журнала
- 7. log4net .... отдельные файлы журнала
- 8. Как зашифровать файлы журнала log4net
- 9. log4net не записывается в журнал
- 10. Log4Net Журнал сообщений
- 11. События Log4Net при создании журнала и записи в журнал FileAppender
- 12. Log4net - ежедневный сбой журнала
- 13. Настройка журнала log4net в dll
- 14. Репозиторий Svn: перенаправить вывод журнала svn
- 15. Log4net прекратил запись в журнал событий
- 16. Как перенаправить вывод cu в файл?
- 17. Устранение дублирования журнала в log4net
- 18. Как перенаправить вывод журнала python в файл вместо stdout?
- 19. Как перенаправить вывод печати SQL в файл журнала?
- 20. Вывод ListBox как многострочный журнал
- 21. Как проверить путь журнала log4net?
- 22. Log4net - не создает файл журнала
- 23. Исключение журнала log4net
- 24. Log4Net, конфигурирующий уровень журнала
- 25. Как перенаправить вывод журнала Python на ярлык Kivy?
- 26. Log4Net Останавливает ведение журнала
- 27. Перенаправить вывод эха в сценарий оболочки в файл журнала
- 28. Как увеличить скорость ведения журнала log4net
- 29. Log4net Не создает файл журнала
- 30. Фиктивные объекты, NUnit, журнал звонков и log4net
также обратите внимание что в Npgsql 3.2.0: «Пользовательское ведение журнала Npgsql было заменено на [Microsoft.Extensions.Logging]». Однако в 3.2.2 он был отменен: «Из-за множества жалоб, использование Npgsql 3.2 в Microsoft.Extensions.Logging было отключено, и регистрация теперь работает так же, как и в Npgsql 3.1». refs: https://github.com/npgsql/Npgsql/releases –