log4net介绍
log4net是一个功能著名的开源日志记录组件。利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中。并且我们还可以记载控制要记载的日志级别,可以记载的日志类别包括:FATAL(致命错误)、ERROR(一般错误)、WARN(警告)、INFO(一般信息)、DEBUG(调试信息)。
log4net安装
这里不多过多介绍了,直接通过nuget安装即可。
log4net.config配置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<!--根配置-->
<root>
<!--日志级别:可选值: ERROR > WARN > INFO > DEBUG -->
<level value="ERROR"/>
<level value="WARN"/>
<level value="INFO"/>
<level value="DEBUG"/>
<appender-ref ref="ErrorLog" />
<appender-ref ref="WarnLog" />
<appender-ref ref="InfoLog" />
<appender-ref ref="DebugLog" />
<appender-ref ref="Sqlserver" />
</root>
<!-- 错误 Error.log-->
<appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">
<!--目录路径,可以是相对路径或绝对路径-->
<param name="File" value="Log\Ide_Net_Cn_log"/>
<!--文件名,按日期生成文件夹-->
<param name="DatePattern" value="/yyyy-MM-dd/"Error.log""/>
<!--追加到文件-->
<appendToFile value="true"/>
<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
<rollingStyle value="Composite"/>
<!--写到一个文件-->
<staticLogFileName value="false"/>
<!--单个文件大小。单位:KB|MB|GB-->
<maximumFileSize value="200MB"/>
<!--最多保留的文件数,设为"-1"则不限-->
<maxSizeRollBackups value="-1"/>
<!--日志格式-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="ERROR" />
</filter>
</appender>
<!-- 警告 Warn.log-->
<appender name="WarnLog" type="log4net.Appender.RollingFileAppender">
<!--目录路径,可以是相对路径或绝对路径-->
<param name="File" value="Log\Ide_Net_Cn_log"/>
<!--文件名,按日期生成文件夹-->
<param name="DatePattern" value="/yyyy-MM-dd/"Warn.log""/>
<!--追加到文件-->
<appendToFile value="true"/>
<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
<rollingStyle value="Composite"/>
<!--写到一个文件-->
<staticLogFileName value="false"/>
<!--单个文件大小。单位:KB|MB|GB-->
<maximumFileSize value="200MB"/>
<!--最多保留的文件数,设为"-1"则不限-->
<maxSizeRollBackups value="-1"/>
<!--日志格式-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="WARN" />
<param name="LevelMax" value="WARN" />
</filter>
</appender>
<!-- 信息 Info.log-->
<appender name="InfoLog" type="log4net.Appender.RollingFileAppender">
<!--目录路径,可以是相对路径或绝对路径-->
<param name="File" value="Log\Ide_Net_Cn_log"/>
<!--文件名,按日期生成文件夹-->
<param name="DatePattern" value="/yyyy-MM-dd/"Info.log""/>
<!--追加到文件-->
<appendToFile value="true"/>
<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
<rollingStyle value="Composite"/>
<!--写到一个文件-->
<staticLogFileName value="false"/>
<!--单个文件大小。单位:KB|MB|GB-->
<maximumFileSize value="200MB"/>
<!--最多保留的文件数,设为"-1"则不限-->
<maxSizeRollBackups value="-1"/>
<!--日志格式-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="INFO" />
</filter>
</appender>
<!-- 调试 Debug.log-->
<appender name="DebugLog" type="log4net.Appender.RollingFileAppender">
<!--目录路径,可以是相对路径或绝对路径-->
<param name="File" value="Log\Ide_Net_Cn_log"/>
<!--文件名,按日期生成文件夹-->
<param name="DatePattern" value="/yyyy-MM-dd/"Debug.log""/>
<!--追加到文件-->
<appendToFile value="true"/>
<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
<rollingStyle value="Composite"/>
<!--写到一个文件-->
<staticLogFileName value="false"/>
<!--单个文件大小。单位:KB|MB|GB-->
<maximumFileSize value="200MB"/>
<!--最多保留的文件数,设为"-1"则不限-->
<maxSizeRollBackups value="-1"/>
<!--日志格式-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="DEBUG" />
</filter>
</appender>
<!-- 调试 Sqlserver.log-->
<appender name="Sqlserver" type="log4net.Appender.ADONetAppender">
<!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库-->
<bufferSize value="0" />
<!--日志数据库连接串-->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="DATABASE=Ide_Net_Cn;SERVER=lisen.org;UID=sa;PWD=123456a?;Connect Timeout=30;" />
<!--日志数据库脚本-->
<commandText value="INSERT INTO LogDetails ([OperationTime],[Url],[Ip],[Host],[Browser],[UserName],[User],Content,ExceptionInfo,ExceptionSource,ExceptionRemark,Level) VALUES ( @OperationTime, @Url, @Ip, @Host, @Browser,@UserName,@User,@Content,@ExceptionInfo,@ExceptionSource,@ExceptionRemark,@Level)" />
<!--日志内码 -->
<!--<parameter>
<parameterName value="@ID" />
<dbType value="String" />
<size value="36" />
<layout type="Ide.Net.Cn.Util.Log.LogLayout" >
<conversionPattern value = "NEWID()"/>
</layout>
</parameter>-->
<!--操作时间-->
<parameter>
<parameterName value="@OperationTime" />
<dbType value="String" />
<size value="100" />
<layout type="Ide.Net.Cn.Util.Log.LogLayout" >
<conversionPattern value = "%property{OperationTime}"/>
</layout>
</parameter>
<!--url -->
<parameter>
<parameterName value="@Url" />
<dbType value="String" />
<size value="255" />
<layout type="Ide.Net.Cn.Util.Log.LogLayout" >
<conversionPattern value = "%property{Url}"/>
</layout>
</parameter>
<!--ip地址-->
<parameter>
<parameterName value="@Ip" />
<dbType value="String" />
<size value="255" />
<layout type="Ide.Net.Cn.Util.Log.LogLayout" >
<conversionPattern value = "%property{Ip}"/>
</layout>
</parameter>
<!--主机-->
<parameter>
<parameterName value="@Host" />
<dbType value="String" />
<size value="255" />
<layout type="Ide.Net.Cn.Util.Log.LogLayout" >
<conversionPattern value = "%property{Host}"/>
</layout>
</parameter>
<!--浏览器-->
<parameter>
<parameterName value="@Browser" />
<dbType value="String" />
<size value="100" />
<layout type="Ide.Net.Cn.Util.Log.LogLayout" >
<conversionPattern value = "%property{Browser}"/>
</layout>
</parameter>
<!--UserName -->
<parameter>
<parameterName value="@UserName" />
<dbType value="String" />
<size value="20" />
<layout type="Ide.Net.Cn.Util.Log.LogLayout" >
<conversionPattern value = "%property{UserName}"/>
</layout>
</parameter>
<!--用户内码-->
<parameter>
<parameterName value="@User" />
<dbType value="String" />
<size value="40" />
<layout type="Ide.Net.Cn.Util.Log.LogLayout" >
<conversionPattern value = "%property{User}"/>
</layout>
</parameter>
<!--日志内容-->
<parameter>
<parameterName value="@Content" />
<dbType value="String" />
<layout type="Ide.Net.Cn.Util.Log.LogLayout" >
<conversionPattern value = "%property{Content}"/>
</layout>
</parameter>
<!--异常信息-->
<parameter>
<parameterName value="@ExceptionInfo" />
<dbType value="String" />
<layout type="Ide.Net.Cn.Util.Log.LogLayout" >
<conversionPattern value = "%property{ExceptionInfo}"/>
</layout>
</parameter>
<!--异常来源-->
<parameter>
<parameterName value="@ExceptionSource" />
<dbType value="String" />
<layout type="Ide.Net.Cn.Util.Log.LogLayout" >
<conversionPattern value = "%property{ExceptionSource}"/>
</layout>
</parameter>
<!--异常信息备注-->
<parameter>
<parameterName value="@ExceptionRemark" />
<dbType value="String" />
<layout type="Ide.Net.Cn.Util.Log.LogLayout" >
<conversionPattern value = "%property{ExceptionRemark}"/>
</layout>
</parameter>
<!--异常等级-->
<parameter>
<parameterName value="@Level" />
<dbType value="String" />
<size value="1" />
<layout type="Ide.Net.Cn.Util.Log.LogLayout" >
<conversionPattern value = "%property{Level}"/>
</layout>
</parameter>
</appender>
<!--Oracle数据库-->
<appender name="OracleAppender" type="log4net.Appender.AdoNetAppender">
<!-- Oracle数据源-->
<connectionType value="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<!-- Oracle连接字符串-->
<connectionString value="DATA SOURCE=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.206)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)));PASSWORD=watdb;PERSIST SECURITY INFO=True;USER ID=watdb;"/>
<commandText value="INSERT INTO SYS_LOG(Dates,Levels,Logger,Message,Exception,ClientUser,ClientIP,RequestUrl,Action)VALUES(:Dates,:Levels,:Logger,:Message,:Exception,:ClientUser,:ClientIP,:RequestUrl,:Action)"/>
<!--
设置缓存区大小
1表明有一条日志就要写入
如果10就表示日志到达10条时一起写入
-->
<bufferSize value="0"/>
<parameter>
<parameterName value=":Dates" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout"/>
</parameter>
<parameter>
<parameterName value=":Levels" />
<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="200" />
<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="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%exception" />
</layout>
</parameter>
<!--DIY-->
<parameter>
<parameterName value=":ClientUser" />
<dbType value="String" />
<size value="100" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{ClientUser}" />
</layout>
</parameter>
<parameter>
<parameterName value=":ClientIP" />
<dbType value="String" />
<size value="20" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{ClientIP}" />
</layout>
</parameter>
<parameter>
<parameterName value=":RequestUrl" />
<dbType value="String" />
<size value="500" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{RequestUrl}" />
</layout>
</parameter>
<parameter>
<parameterName value=":Action" />
<dbType value="String" />
<size value="20" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{Action}" />
</layout>
</parameter>
</appender>
<!--Sqlite数据库-->
<appender name="SqliteAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="0" />
<connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.98.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
<connectionString value="Data Source=|DataDirectory|test.db;Version=3;" />
<commandText value="INSERT INTO Log (Date, Level, Logger, ClientUser,ClientIP, RequestUrl,Action, Message, Exception) VALUES (@Date, @Level, @Logger,@ClientUser,@ClientIP, @RequestUrl,@Action, @Message, @Exception)" />
<parameter>
<parameterName value="@Date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@Level" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@Logger" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@ClientUser" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{ClientUser}" />
</layout>
</parameter>
<parameter>
<parameterName value="@ClientIP" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{ClientIP}" />
</layout>
</parameter>
<parameter>
<parameterName value="@RequestUrl" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{RequestUrl}" />
</layout>
</parameter>
<parameter>
<parameterName value="@Action" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{Action}" />
</layout>
</parameter>
<parameter>
<parameterName value="@Message" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@Exception" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%exception" />
</layout>
</parameter>
</appender>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
<!--
调用实例
log4net.ILog log = log4net.LogManager.GetLogger("Filelog");
log.Info(Message);
%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
%n(new line):换行
%d(datetime):输出当前语句运行的时刻
%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id):当前语句所在的线程ID
%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
%c(class):当前日志对象的名称
%L:输出语句所在的行号
%F:输出语句所在的文件名
%-数字:表示该项的最小长度,如果不够,则用空格填充
例如,转换模式为%r [%t]%-5p %c - %m%n 的 PatternLayout 将生成类似于以下内容的输出:
176 [main] INFO org.foo.Bar - Located nearest gas station.
-->
定义实体类LogEntity.cs
/*************************************************************************************
* CLR版 本: 4.0.30319.42000
* 机器名称: LISEN0100
* 命名空间: Ide.Net.Cn.Util.Log
* 文件名称: LogEntity
* 创建时间: 2018/3/11 15:51:49
* 作 者: 木子网
* 个人博客: http://www.xiangcaowuyu.net
* 个人邮箱: lisen@lisen.org
* 文件说明:
* 修改时间:
* 修 改 人: 木子网
* 修改说明:
*************************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ide.Net.Cn.Util.Log
{
public class LogEntity
{
#region 属性
/// <summary>
/// 操作时间
/// </summary>
public DateTime OperationTime { get; set; }
/// <summary>
/// Url地址
/// </summary>
public string Url { get; set; }
/// <summary>
/// 类名
/// </summary>
public string Class { get; set; }
/// <summary>
/// IP
/// </summary>
public string Ip { get; set; }
/// <summary>
/// 主机
/// </summary>
public string Host { get; set; }
/// <summary>
/// 浏览器
/// </summary>
public string Browser { get; set; }
/// <summary>
/// 操作人
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 操作人编号或内码
/// </summary>
public string User { get; set; }
/// <summary>
/// 内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 异常信息
/// </summary>
public string ExceptionInfo { get; set; }
/// <summary>
/// 异常来源
/// </summary>
public string ExceptionSource { get; set; }
/// <summary>
/// 异常信息备注
/// </summary>
public string ExceptionRemark { get; set; }
#endregion
#region 构造函数
#endregion
#region 方法
#endregion
}
}
定义文本格式化类LogFormat.cs,用于控制文本输出
/*************************************************************************************
* CLR版 本: 4.0.30319.42000
* 机器名称: LISEN0100
* 命名空间: Ide.Net.Cn.Util.Log
* 文件名称: LogFormat
* 创建时间: 2018/3/11 16:37:24
* 作 者: 木子网
* 个人博客: http://www.xiangcaowuyu.net
* 个人邮箱: lisen@lisen.org
* 文件说明: 格式化消息实体
* 修改时间:
* 修 改 人: 木子网
* 修改说明:
*************************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ide.Net.Cn.Util.Log
{
public class LogFormat
{
#region 属性
#endregion
#region 构造函数
#endregion
#region 方法
/// <summary>
/// 生成错误
/// </summary>
/// <param name="logEntity">对象</param>
/// <returns></returns>
public static string ErrorFormat(LogEntity logEntity)
{
StringBuilder strInfo = new StringBuilder();
strInfo.Append("1. 错误: >> 操作时间: " + logEntity.OperationTime + " 操作人: " + logEntity.UserName + " 操作人编号: " + logEntity.User + " \r\n");
strInfo.Append("2. 地址: " + logEntity.Url + " \r\n");
strInfo.Append("3. 类名: " + logEntity.Class + " \r\n");
strInfo.Append("4. Ip : " + logEntity.Ip + " 主机: " + logEntity.Host + " 浏览器: " + logEntity.Browser + " \r\n");
strInfo.Append("5. 内容: " + logEntity.Content + "\r\n");
strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");
return strInfo.ToString();
}
/// <summary>
/// 生成警告
/// </summary>
/// <param name="logEntity">对象</param>
/// <returns></returns>
public static string WarnFormat(LogEntity logEntity)
{
StringBuilder strInfo = new StringBuilder();
strInfo.Append("1. 警告: >> 操作时间: " + logEntity.OperationTime + " 操作人: " + logEntity.UserName + " 操作人编号: " + logEntity.User + " \r\n");
strInfo.Append("2. 地址: " + logEntity.Url + " \r\n");
strInfo.Append("3. 类名: " + logEntity.Class + " \r\n");
strInfo.Append("4. Ip : " + logEntity.Ip + " 主机: " + logEntity.Host + " 浏览器: " + logEntity.Browser + " \r\n");
strInfo.Append("5. 内容: " + logEntity.Content + "\r\n");
strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");
return strInfo.ToString();
}
/// <summary>
/// 生成信息
/// </summary>
/// <param name="logEntity">对象</param>
/// <returns></returns>
public static string InfoFormat(LogEntity logEntity)
{
StringBuilder strInfo = new StringBuilder();
strInfo.Append("1. 信息: >> 操作时间: " + logEntity.OperationTime + " 操作人: " + logEntity.UserName + " 操作人编号: " + logEntity.User + " \r\n");
strInfo.Append("2. 地址: " + logEntity.Url + " \r\n");
strInfo.Append("3. 类名: " + logEntity.Class + " \r\n");
strInfo.Append("4. Ip : " + logEntity.Ip + " 主机: " + logEntity.Host + " 浏览器: " + logEntity.Browser + " \r\n");
strInfo.Append("5. 内容: " + logEntity.Content + "\r\n");
strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");
return strInfo.ToString();
}
/// <summary>
/// 生成调试
/// </summary>
/// <param name="logEntity">对象</param>
/// <returns></returns>
public static string DebugFormat(LogEntity logEntity)
{
StringBuilder strInfo = new StringBuilder();
strInfo.Append("1. 调试: >> 操作时间: " + logEntity.OperationTime + " 操作人: " + logEntity.UserName + " 操作人编号: " + logEntity.User + " \r\n");
strInfo.Append("2. 地址: " + logEntity.Url + " \r\n");
strInfo.Append("3. 类名: " + logEntity.Class + " \r\n");
strInfo.Append("4. Ip : " + logEntity.Ip + " 主机: " + logEntity.Host + " 浏览器: " + logEntity.Browser + " \r\n");
strInfo.Append("5. 内容: " + logEntity.Content + "\r\n");
strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");
return strInfo.ToString();
}
/// <summary>
/// 生成异常信息
/// </summary>
/// <param name="logEntity">对象</param>
/// <returns></returns>
public static string ExceptionFormat(LogEntity logEntity)
{
StringBuilder strInfo = new StringBuilder();
strInfo.Append("1. 调试: >> 操作时间: " + logEntity.OperationTime + " 操作人: " + logEntity.UserName + " 操作人编号: " + logEntity.User + " \r\n");
strInfo.Append("2. 地址: " + logEntity.Url + " \r\n");
strInfo.Append("3. 类名: " + logEntity.Class + " \r\n");
strInfo.Append("4. 主机: " + logEntity.Host + " Ip : " + logEntity.Ip + " 浏览器: " + logEntity.Browser + " \r\n");
strInfo.Append("5. 异常: " + logEntity.ExceptionInfo + "\r\n");
//strInfo.Append("6. 来源: " + logEntity.ExceptionSource + "\r\n");
//strInfo.Append("7. 实例: " + logEntity.ExceptionRemark + "\r\n");
strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");
return strInfo.ToString();
}
#endregion
}
}
定义工厂类LogFactory.cs,返回log类型
/*************************************************************************************
* CLR版 本: 4.0.30319.42000
* 机器名称: LISEN0100
* 命名空间: Ide.Net.Cn.Util.Log
* 文件名称: LogFactory
* 创建时间: 2018/3/11 15:27:20
* 作 者: 木子网
* 个人博客: http://www.xiangcaowuyu.net
* 个人邮箱: lisen@lisen.org
* 文件说明: 日志工厂类,产生错误、警告、信息、调试类
* 修改时间:
* 修 改 人: 木子网
* 修改说明:
*************************************************************************************/
using log4net;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
namespace Ide.Net.Cn.Util.Log
{
public class LogFactory
{
#region 属性
#endregion
#region 构造函数
/// <summary>
/// 构造函数
/// </summary>
static LogFactory()
{
FileInfo fileInfo = new FileInfo(HttpContext.Current.Server.MapPath("~/XmlConfig/log4net.config"));
log4net.Config.XmlConfigurator.ConfigureAndWatch(fileInfo);
}
#endregion
#region 方法
public static ILog GetLogger(LogLevel logLevel)
{
ILog log = null;
switch (logLevel)
{
case LogLevel.Error:
log = LogManager.GetLogger("ErrorLog");
break;
case LogLevel.Warning:
log = LogManager.GetLogger("WarnLog");
break;
case LogLevel.Info:
log = LogManager.GetLogger("InfoLog");
break;
case LogLevel.Debug:
log = LogManager.GetLogger("DebugLog");
break;
}
return log;
}
public static ILog ErrorLog()
{
return LogManager.GetLogger("ErrorLog");
}
public static ILog WarnLog()
{
return LogManager.GetLogger("WarnLog");
}
public static ILog InfoLog()
{
return LogManager.GetLogger("InfoLog");
}
public static ILog DebugLog()
{
return LogManager.GetLogger("DebugLog");
}
public static ILog SqlLog()
{
return LogManager.GetLogger("Sqlserver");
}
#endregion
}
}
定义公共类log.cs,用于输出日志
/*************************************************************************************
* CLR版 本: 4.0.30319.42000
* 机器名称: LISEN0100
* 命名空间: Ide.Net.Cn.Util.Log
* 文件名称: Log
* 创建时间: 2018/3/11 15:04:03
* 作 者: 木子网
* 个人博客: http://www.xiangcaowuyu.net
* 个人邮箱: lisen@lisen.org
* 文件说明: 日志文件类
* 修改时间:
* 修 改 人: 木子网
* 修改说明:
*************************************************************************************/
using log4net;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ide.Net.Cn.Util.Log
{
public class Log
{
#region 字段属性
private ILog log;
private bool IsLog = true;
#endregion
#region 构造函数
public Log(ILog log)
{
this.log = log;
IsLog = ConfigurationManager.AppSettings["IsLog"].ToLower() == "true" ? true : false;
}
#endregion
#region 方法
/// <summary>
/// 写入错误日志
/// </summary>
/// <param name="errorMsg">错误消息</param>
public void Error(LogEntity errorMsg)
{
if (IsLog)
{
log.Error(LogFormat.ErrorFormat(errorMsg));
}
}
/// <summary>
/// 写入警告日志
/// </summary>
/// <param name="warnMsg">警告消息</param>
public void Warn(LogEntity warnMsg)
{
if (IsLog)
{
log.Warn(LogFormat.WarnFormat(warnMsg));
}
}
/// <summary>
/// 写入警告日志
/// </summary>
/// <param name="warnMsg">警告消息</param>
public void Warn(LogEntity warnMsg, Exception exception)
{
if (IsLog)
{
log.Warn(LogFormat.WarnFormat(warnMsg), exception);
}
}
/// <summary>
/// 写入信息日志
/// </summary>
/// <param name="infoMsg">信息消息</param>
public void Info(LogEntity infoMsg)
{
if (IsLog)
{
log.Info(LogFormat.InfoFormat(infoMsg));
}
}
/// <summary>
/// 写入调试日志
/// </summary>
/// <param name="debugMsg">调试消息</param>
public void Debug(LogEntity debugMsg)
{
if (IsLog)
{
log.Debug(LogFormat.DebugFormat(debugMsg));
}
}
#endregion
}
}
使用
定义一个aspx页面,窗体载入后测试日志文件
using Ide.Net.Cn.Util.Log;
using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Ide.Net.Cn.Web
{
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//ILog log = LogFactory.ErrorLog();//文本日志
ILog log = LogFactory.SqlLog();//数据库日志
Log logger = new Log(log);
LogEntity logEntity = new LogEntity
{
OperationTime = DateTime.Now,
Url = "www.xiangcaowuyu.net"
};
try
{
logger.Warn(logEntity);
}
catch (Exception ex)
{
logger.Warn(logEntity, ex);
}
}
}
}
}
数据库表结构
USE [Ide_Net_Cn]
GO
/****** Object: Table [dbo].[LogDetails] Script Date: 03/11/2018 19:13:45 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[LogDetails](
[ID] [varchar](36) NOT NULL,
[OperationTime] [datetime] NULL,
[Url] [varchar](255) NULL,
[Ip] [nvarchar](255) NULL,
[Host] [nvarchar](255) NULL,
[Browser] [nvarchar](100) NULL,
[UserName] [nvarchar](20) NULL,
[User] [nvarchar](40) NULL,
[Content] [nvarchar](max) NULL,
[ExceptionInfo] [nvarchar](max) NULL,
[ExceptionSource] [nvarchar](max) NULL,
[ExceptionRemark] [nvarchar](max) NULL,
[Level] [char](1) NULL,
PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
CONSTRAINT [LogDetails_Code] UNIQUE NONCLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'浏览器型号+版本号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'LogDetails', @level2type=N'COLUMN',@level2name=N'Browser'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'1-error;
2-warn;
3-info;
4-debug' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'LogDetails', @level2type=N'COLUMN',@level2name=N'Level'
GO
ALTER TABLE [dbo].[LogDetails] ADD DEFAULT (newid()) FOR [ID]
GO
ALTER TABLE [dbo].[LogDetails] ADD DEFAULT (NULL) FOR [ExceptionSource]
GO
谢谢哦
不错不错