1. 右键项目使用 NuGet 安装 log4net
2. 新建 log4net.config 文件
1. Error 日志
2. Info 日志
3. 自定义日志
4. 数据库日志(含自定义字段
注意:
log4net.config 根目录:
2-1 Error 日志
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log\\LogError\\" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd'.txt'" />
<staticLogFileName value="false" />
<param name="MaxSizeRollBackups" value="100" />
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<!--输出格式-->
<!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n错误描述:%message%newline %n" />
</layout>
</appender>
<logger name="logerror">
<level value="ERROR" />
<appender-ref ref="RollingLogFileAppender" />
</logger>
2-2 Info 日志
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<file value="Log\\LogInfo\\" />
<appendToFile value="true" />
<maxFileSize value="10240" />
<maxSizeRollBackups value="100" />
<staticLogFileName value="false" />
<datePattern value="yyyyMMdd'.txt'" />
<rollingStyle value="Date" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n日志描述:%message%newline %n" />
</layout>
</appender>
<logger name="loginfo">
<level value="INFO" />
<appender-ref ref="InfoAppender" />
</logger>
2-3 自定义日志
<appender name="MonitorAppender" type="log4net.Appender.RollingFileAppender">
<file value="Log\\LogMonitor\\" />
<appendToFile value="true" />
<maxFileSize value="10240" />
<maxSizeRollBackups value="100" />
<staticLogFileName value="false" />
<datePattern value="yyyyMMdd'.txt'" />
<rollingStyle value="Date" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n跟踪描述:%message%newline %n" />
</layout>
</appender>
<logger name="logmonitor">
<level value="Monitor" />
<appender-ref ref="MonitorAppender" />
</logger>
2-4 数据库日志
建议先将 官方数据库日志示例 跑通后,再加入自定义字段。
SqlServer :
CREATE TABLE [dbo].[Log] (
[Id] [int] IDENTITY (1, 1) NOT NULL,
[Date] [datetime] NOT NULL,
[Thread] [varchar] (255) NOT NULL,
[Level] [varchar] (50) NOT NULL,
[Logger] [varchar] (255) NOT NULL,
[Message] [varchar] (4000) NOT NULL,
[Exception] [varchar] (2000) NULL,
[job_code] [varchar] (100) NULL,
[stream_id] [varchar] (100) NULL
)
配置说明:
自定义类:
using log4net.Layout;
using log4net.Layout.Pattern;
using System;
using System.Collections.Generic;
using System.Linq;
using log4net.Core;
using System.IO;
using System.Reflection;
namespace RaysCloud.Common
{
/// <summary>
/// 自定义日志类 对应数据库表字段
/// </summary>
public class LogContent
{
public string job_code { get; set; }
public string stream_id { get; set; }
}
public class CustomLoyout : PatternLayout
{
public CustomLoyout()
{
this.AddConverter("property", typeof(LogInfoPatternConverter));
}
}
public class LogInfoPatternConverter : PatternLayoutConverter
{
protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
{
if (Option != null)
{
WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
}
else
{
WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
}
}
/// <summary>
/// 反射获取传入日志对象的某个属性的值
/// </summary>
/// <param name="property"></param>
/// <param name="loggingEvent"></param>
/// <returns></returns>
private object LookupProperty(string property, LoggingEvent loggingEvent)
{
object propertyValue = string.Empty;
PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
if (property != null)
{
propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
}
return propertyValue;
}
}
}
log4net 配置:
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="100" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_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="@log_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>
<logger name="logadonet">
<level value="ALL"/>
<appender-ref ref="AdoNetAppender"/>
</logger>
</appender>
3.Web.config 配置
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net configSource="log4net.config" />
4.Global.aspx
protected void Application_Start()
{
log4net.Config.XmlConfigurator.Configure(); // log4net 配置
}
5.LogHelper.cs
随便写的一个辅助类,可自行扩展
using System;
namespace RaysCloud.Common
{
/// <summary>
/// 日志类
/// </summary>
public class LogHelper
{
private static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
private static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
private static readonly log4net.ILog logmonitor = log4net.LogManager.GetLogger("logmonitor");
private static readonly log4net.ILog log_db = log4net.LogManager.GetLogger("logadonet");
/// <summary>
/// 错误日志
/// </summary>
/// <param name="errorMsg">错误信息</param>
/// <param name="ex">异常</param>
public static void Error(string errorMsg, Exception ex = null)
{
logerror.Error(errorMsg, ex);
}
/// <summary>
/// 普通日志
/// </summary>
/// <param name="msg">信息</param>
public static void Info(string msg)
{
loginfo.Info(msg);
}
/// <summary>
/// 监控日志
/// </summary>
/// <param name="msg">信息</param>
public static void Monitor(string msg)
{
logmonitor.Info(msg);
}
#region 写入日志到数据库 http://blog.csdn.net/kongwei521/article/details/52242319
public static void ErrorToDB(object message, Exception ex = null)
{
log_db.Error(message, ex);
}
public static void InfoToDB(object message, Exception ex = null)
{
log_db.Info(message, ex);
}
#endregion
}
}
6.日志截图:
源码:https://git.oschina.net/PoloN...
本文数据库日志参考于:http://blog.csdn.net/kongwei5...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。