Log4net自定義配置說明及排錯方法
1、日志記錄到數據庫時,如對應日志表無日志,可通過如下方式排查:
A、檢查數據庫的連接事件日志,如無任何事件,則表明數據庫連接失敗,這時需要排查log4net.config的配置;如有事件,則將對應Insert Sql直接在數據庫內執行,排查對應SQL錯誤即可。
B、在AspnetCore中使用時Microsoft.Extensions.Logging.Log4Net.AspNetCore包時,如SQL Server的連接驅動設置為 System.Data.SqlClient時,會數據庫連接失敗,且系統捕獲不到異常。需要必須使用Microsoft.Data.SqlClient.
C、在配置log4net的配置文件 log4net節點一定要設置為:<log4net debug="true">, 不然即使在program內也捕獲不到其全局異常。
2、如需要開發自定義參數的Logger,可以參考如下代碼:
A、 定義工具類
using log4net;
using log4net.Core;
using log4net.Layout;
using System.Reflection;
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace XD.OIDC.Core
{
public class XDLogPatternLayout : PatternLayout
{
public XDLogPatternLayout()
{
this.AddConverter("XDLayout", typeof(XDLogConvert));
}
}
public class XDLogConvert : log4net.Layout.Pattern.PatternLayoutConverter
{
protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
{
if (!string.IsNullOrEmpty(Option))
{
object obj = loggingEvent.MessageObject;
if (obj != null)
{
PropertyInfo info = obj.GetType().GetProperty(Option);
if (info != null)
{
object custMsg = info.GetValue(obj, null);
writer.Write(custMsg);
}
}
}
}
}
public class XDLogModel
{
public string IP { get; set; } = "localhost";
public string UserName { get; set; } = "張三";
public string Msg { get; set; } = "XDLog Message";
}
public class LogHelper
{
private static readonly log4net.ILog logDefault = log4net.LogManager.GetLogger("XDLOG");
public static XDLogModel GetXDLogModel()
{
XDLogModel model = new XDLogModel();
return model;
}
public static void LogInfo(XDLogModel msg) {
logDefault.InfoFormat($"IP:{msg.IP},UserName:{msg.UserName},Mesage:{msg.Msg}", msg);
logDefault.Info(msg );
}
}
}
B、在需要的位置記錄日志
XD.OIDC.Core.LogHelper.LogInfo( new XD.OIDC.Core.XDLogModel { IP="localhost", UserName = "張三",Msg = "李四"});
C、Log4net.config文件配置
<log4net>
<appender name="SqlServer_AdoNetAppender"
type="log4net.Appender.AdoNetAppender">
<!--每次緩存的消息數,bufferSize=0時,表示每條日志立即寫入DB-->
<bufferSize value="0"/>
<connectionType value="Microsoft.Data.SqlClient.SqlConnection,Microsoft.Data.SqlClient, Version=5.0.0.0, Culture=neutral, PublicKeyToken=23ec7fc2d6eaa4a5"/>
<connectionString value="Data Source=.\sqlexpress;Initial Catalog=XDLog;User ID=sa;Password=123456;Trust Server Certificate=True"/>
<commandText value="INSERT INTO Sys_Log(Date,Thread,Level,Logger,Message,Exception) VALUES (@date, @thread, @level, @logger, @message, @exception)"/>
<parameter>
<parameterName value="@date"/>
<dbType value="DateTime"/>
<layout type="log4net.Layout.RawTimeStampLayout"/>
</parameter>
<parameter>
<parameterName value="@thread"/>
<dbType value="String"/>
<size value="255"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread"/>
</layout>
</parameter>
<parameter>
<parameterName value="@level"/>
<dbType value="String"/>
<size value="50"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level"/>
</layout>
</parameter>
<parameter>
<parameterName value="@logger"/>
<dbType value="String"/>
<size value="255"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger"/>
</layout>
</parameter>
<parameter>
<parameterName value="@message"/>
<dbType value="String"/>
<size value="4000"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message"/>
</layout>
</parameter>
<parameter>
<parameterName value="@exception"/>
<dbType value="String"/>
<size value="2000"/>
<layout type="log4net.Layout.ExceptionLayout"/>
</parameter>
</appender>
<appender name="SqlServer_AdoNet_Http_Appender"
type="log4net.Appender.AdoNetAppender">
<!--每次緩存的消息數,bufferSize=0時,表示每條日志立即寫入DB-->
<bufferSize value="0"/>
<connectionType value="Microsoft.Data.SqlClient.SqlConnection,Microsoft.Data.SqlClient, Version=5.0.0.0, Culture=neutral, PublicKeyToken=23ec7fc2d6eaa4a5"/>
<connectionString value="Data Source=.\sqlexpress;Initial Catalog=XDLog;User ID=sa;Password=123qwe!@#;Trust Server Certificate=True"/>
<commandText value="INSERT INTO Sys_Log_Http(Date,Thread,Level,Logger,Message,Exception) VALUES (@date, @thread, @level, @logger, @message, @exception)"/>
<parameter>
<parameterName value="@date"/>
<dbType value="DateTime"/>
<layout type="log4net.Layout.RawTimeStampLayout"/>
</parameter>
<parameter>
<parameterName value="@thread"/>
<dbType value="String"/>
<size value="255"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread"/>
</layout>
</parameter>
<parameter>
<parameterName value="@level"/>
<dbType value="String"/>
<size value="50"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level"/>
</layout>
</parameter>
<parameter>
<parameterName value="@logger"/>
<dbType value="String"/>
<size value="255"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger"/>
</layout>
</parameter>
<parameter>
<parameterName value="@message"/>
<dbType value="String"/>
<size value="4000"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message"/>
</layout>
</parameter>
<parameter>
<parameterName value="@exception"/>
<dbType value="String"/>
<size value="2000"/>
<layout type="log4net.Layout.ExceptionLayout"/>
</parameter>
</appender>
<appender name="Console"
type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<!-- Pattern to output the caller's file name and line number -->
<conversionPattern value="%date %5level %logger.%method [%line] - MESSAGE: %message%newline %exception"/>
</layout>
</appender>
<appender name="ConsoleAppender"
type="log4net.Appender.ManagedColoredConsoleAppender">
<mapping>
<level value="ERROR"/>
<foreColor value="Red"/>
</mapping>
<mapping>
<level value="WARN"/>
<foreColor value="Yellow"/>
</mapping>
<mapping>
<level value="INFO"/>
<foreColor value="White"/>
</mapping>
<mapping>
<level value="DEBUG"/>
<foreColor value="Green"/>
</mapping>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %5level %logger.%method [%line] - MESSAGE: %message%newline %exception"/>
</layout>
</appender>
<appender name="XDAdo_Appender"
type="log4net.Appender.AdoNetAppender">
<!--每次緩存的消息數,bufferSize=0時,表示每條日志立即寫入DB-->
<bufferSize value="0"/>
<connectionType value="Microsoft.Data.SqlClient.SqlConnection,Microsoft.Data.SqlClient, Version=5.0.0.0, Culture=neutral, PublicKeyToken=23ec7fc2d6eaa4a5"/>
<connectionString value="Data Source=.\sqlexpress;Initial Catalog=XDLog;User ID=sa;Password=123qwe!@#;Trust Server Certificate=True"/>
<commandText value="INSERT INTO Sys_Log_Xd(Date,IP,UserName,Msg) VALUES (getdate(), @IP, @UserName,@Msg)"/>
<parameter>
<parameterName value="@IP"/>
<dbType value="String"/>
<size value="255"/>
<layout type="XD.OIDC.Core.XDLogPatternLayout">
<XDLogConvert value="%IP"/>
</layout>
</parameter>
<parameter>
<parameterName value="@UserName"/>
<dbType value="String"/>
<size value="255"/>
<layout type="XD.OIDC.Core.XDLogPatternLayout">
<XDLogConvert value="%UserName"/>
</layout>
</parameter>
<parameter>
<parameterName value="@Msg"/>
<dbType value="String"/>
<size value="255"/>
<layout type="XD.OIDC.Core.XDLogPatternLayout">
<XDLogConvert value="%Msg"/>
</layout>
</parameter>
<!--<layout type="XD.OIDC.Core.XDLogPatternLayout">
<conversionPattern value="%XDLayout{@IP} %XDLayout{@UserName} %XDLayout{@Msg} " />
</layout>-->
</appender>
<logger name="Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware">
<!--
日志的Level設置值:ALL、EBUG、INFO、WARN、ERROR、FATAL、OFF 如需高級調試設置以及log4net的高級配置請參見log4net文檔
-->
<level value="INFO"/>
<appender-ref ref="SqlServer_AdoNet_Http_Appender"/>
</logger>
<logger name="XDLOG">
<level value="INFO"/>
<appender-ref ref="XDAdo_Appender"/>
</logger>
<root>
<!--日志的Level設置值:ALL、DEBUG、INFO、WARN、ERROR、FATAL、OFF 如需高級調試設置以及log4net的高級配置請參見log4net文檔-->
<level value="TRACE"/>
<appender-ref ref="RollingFile"/>
<appender-ref ref="TraceAppender"/>
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="SqlServer_AdoNetAppender"/>
</root>
</log4net>
3、如log4net日志記錄在數據庫時,其數據庫驅動不必在項目內引用(因為log4net是根據配置文件去查找驅動),只需將對應的數據驅動Copy到運行目錄即可。
浙公網安備 33010602011771號