首页
归档
留言
友链
广告合作
壁纸
更多
美女主播
Search
1
博瑞GE车机升级/降级
5,573 阅读
2
Mac打印机设置黑白打印
4,884 阅读
3
修改elementUI中el-table树形结构图标
4,861 阅读
4
Mac客户端添加腾讯企业邮箱方法
4,645 阅读
5
intelliJ Idea 2022.2.X破解
4,313 阅读
Java
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
登录
/
注册
Search
标签搜索
Spring Boot
Java
Spring Cloud
Mac
MyBatis
WordPress
Nacos
Spring Cloud Alibaba
MacOS
Mybatis-Plus
Typecho
jQuery
Java Script
asp.net
MySQL
IntelliJ IDEA
微信小程序
Sentinel
UniApp
asp.net core
Laughing
累计撰写
613
篇文章
累计收到
1,427
条评论
首页
栏目
Java
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
页面
归档
留言
友链
广告合作
壁纸
美女主播
搜索到
4
篇与
的结果
2018-03-11
log4net详细介绍
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://lisen.cc * 个人邮箱: 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://lisen.cc * 个人邮箱: lisen@lisen.cc * 文件说明: 格式化消息实体 * 修改时间: * 修 改 人: 李森的博客 * 修改说明: *************************************************************************************/ 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://lisen.cc * 个人邮箱: 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://lisen.cc * 个人邮箱: lisen@lisen.cc * 文件说明: 日志文件类 * 修改时间: * 修 改 人: 李森的博客 * 修改说明: *************************************************************************************/ 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 = "lisen.cc" }; 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
2018年03月11日
1,179 阅读
0 评论
1 点赞
2018-03-11
log4net不写日志原因分析
今天闲着没事看了一下log4net的东西,本来打算写个简单的日志,但是发现系统没有记录日志。其实出现这种情况,基本可以断定是配置文件没有读取到导致的。问题排查为了能够排查问题,我们打开vs查看输出信息如图所示,提示我没有加载上配置文件,由于我把配置文件放到单独项目,所以调增了一下我的配置文件读取方式,如下:FileInfo fileInfo = new FileInfo(HttpContext.Current.Server.MapPath("~/XmlConfig/log4net.config")); log4net.Config.XmlConfigurator.ConfigureAndWatch(fileInfo); 然后就可以看到输出了
2018年03月11日
1,240 阅读
0 评论
0 点赞
2017-08-06
配置log4net写日志到数据库
前一篇我们介绍了log4net写日志到文件的方法,具体可以参考。 [url 配置log4net写日志到文件这一篇我们继续介绍log4net写日志到数据库的方法。数据库创建脚本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 ) ON [PRIMARY]配置文件修改我们只需要修改配置文件,设置数据库类型、数据库连接信息以及sql语句即可,其他的跟写入文件的方式是相同的<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <!--定义输出到数据库中--> <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <bufferSize value="1" /> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="server=114.115.214.130;database=lisen;UID=lisen;PWD=19900629;" /> <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> </appender> <root> <!--OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL--> <level value="ALL"/> <!--数据库形式记录日志--> <appender-ref ref="AdoNetAppender"/> </root> </log4net> </configuration>
2017年08月06日
1,042 阅读
0 评论
0 点赞
2017-08-06
配置log4net写日志到文件
所有的项目都离不开日志记录功能,log4net是一个功能强大的日志组件,log4net支持将日志写到文件或者写到数据库中。这篇文章,我们主要介绍简单的,将日志写入到文件中。环境安装现在做.net的基本都是使用nuget了吧,安装方法页很简单,直接在nuget包管理器中搜索log4net,然后安装即可。配置文件为了保证项目的整洁性,我们建议将log4net的配置文件,放到单独的config文件中,我们可以将log4net的配置文件,放到网站根目录的log4net.config文件中,config文件配置如下<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <!--定义输出到文件中--> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--定义文件存放位置--> <file value="log//"/> <appendToFile value="true"/> <rollingStyle value="Date"/> <datePattern value="yyyy-MM-dd'.txt'"/> <staticLogFileName value="false"/> <param name="MaxSizeRollBackups" value="100"/> <param name="Encoding" value="utf-8" /> <layout type="log4net.Layout.PatternLayout"> <!--<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline %n"/>--> <conversionPattern value="%newline %nDate:%date %nThread:[%thread] %nLevel: %-5level %nClass: %logger [%property{NDC}] %nMessage: %message%newline" /> </layout> </appender> <root> <level value="ALL"/> <!--文件形式记录日志--> <appender-ref ref="RollingLogFileAppender"/> </root> </log4net> </configuration>是配置生效我们可以把配置文件放到AssemblyInfo.cs文件中,也可以放到其他在调用日志方法之间的任意一个类的命名空间之上。我这里放到了Gloabal.asax.cs文件中的。using System.Web; using System.Web.Mvc; using System.Web.Routing; [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)] namespace MVCDemo.WebUI { public class Global : HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); } } }使用方法使用方法非常简单,直接初始化ILog接口,然后调用方法写入日志即可log4net.ILog log = log4net.LogManager.GetLogger(typeof(HomeController)); public ActionResult Index() { log.Warn("test..."); return View (); }
2017年08月06日
1,246 阅读
1 评论
0 点赞