log4net使用注意事项
1配置Log4net
Log4net的配置文件有几种使用方式,这里将配置log4net的部分独立出来,即关于log4net的配置独立成文件log4net.config。
1)写入Mysql
log4net.config文件配置
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<logger name="ErrorLog">
<level value="Error"/>
<appender-ref ref="ErrorAppender"/>
</logger>
<logger name="OperationLog">
<level value="Info"/>
<appender-ref ref="OperationAppender"/>
</logger>
<appender name="ErrorAppender" type="log4net.Appender.ADONetAppender">
<bufferSize value="1"/>
<connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" />
<connectionString value="Database=log;Data Source=192.168.107.13;User Id=root;Password=cnki2017;CharSet=utf8;port=3306"/>
<commandText value="INSERT INTO errorlogs (`InsertTime`,`Level`,`Message`,`ExceptionMessage`) VALUES (@log_date, @log_level, @message, @exception)"/>
<parameter>
<parameterName value="@log_date"/>
<dbType value="DateTime"/>
<layout type="log4net.Layout.RawTimeStampLayout"/>
</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="@exception"/>
<dbType value="String"/>
<size value="4000"/>
<layout type="log4net.Layout.ExceptionLayout"/>
</parameter>
<parameter>
<parameterName value="@message"/>
<dbType value="String"/>
<size value="2000"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message"/>
</layout>
</parameter>
</appender>
</log4net>
</configuration>
在控制台程序中使用:
class Program
{
static void Main(string[] args)
{
try
{
var path = string.Format("{0}{1}", System.AppDomain.CurrentDomain.BaseDirectory, "Log4net.config");
ICollection c = log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(path));
ILog log = log4net.LogManager.GetLogger("ErrorLog");
log.Error("wwwww", new Exception("测试抛出"));
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
运行上面的代码,成功地将数据记录到数据库中。
2)写入日志文件
appender配置节说明
file |
string |
日志文件存放位置,可以为绝对路径也可以为相对路径 |
---|---|---|
appendToFile |
boolean |
是否追加到已有的日志文件中 |
rollingStyle |
Size/Date |
切分日志的模式。Size:按大小切分,Date按日期切分 |
maxSizeRollBackups |
int |
当rollingStyle为Size模式时,指定备份日志文件的最大切分数量,如果超过指定值,日志将进行覆写。 |
maximumFileSize |
int |
当rollingStyle为Size模式时,指定每个切分日志文件的大小 |
datePattern |
string |
当rollingStyle为Date模式时,日志文件名称的一部分,可设置时间格式。 |
staticLogFileName |
boolean |
指定是否为静态文件名。 若指定为true,那么文件名以file 中定义的文件名为准。 若为false,当rollingStyle为Date模式时,文件名为file 和datePattern共同构成的 |
layout |
输出日志的样式 其下的配置节conversionPattern 控制着输出的样式 |
|
lockingModel |
string |
最小锁定模型以允许多个进程可以写入同一个文件 |
encoding |
string |
文件编码 |
示例:
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<appender name="TxtLogRollingFileAppender"
type="log4net.Appender.RollingFileAppender">
<file value="log\RollingFile" />
<appendToFile value="true" />
<rollingStyle value="date" />
<datePattern value="yyyy-MM-dd".log""/>
<staticLogFileName value="false"/>
<encoding value="utf-8" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<param name="conversionPattern" value="时间:%date%newline 线程:[%thread]%newline日志类型:%-5level%newline内 容:%message" />
<param name="header" value=" ------------开始 --------------- " />
<param name="footer" value=" ------------- 结束 ------------ " />
</layout>
</appender>
</log4net>
</configuration>
Main函数中:
ICollection c = log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(@"E:projgxz_myselfLog4NetTestLog4net.config"));
ILog log = log4net.LogManager.GetLogger("TxtLogRollingFileAppender");
log.Info("测试输出信息");
Console.Read();
2遇到的问题
1)数据库的访问。
当访问的数据库不存在或表不存在或连接配置不正确时,并不会抛出异常。
2)不会返回配置文件信息集合。
ICollection c = log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(path));
这行代码返回值是ICollection,然而并不会获得配置文件信息,返回的集合居然是空。
3)配置文件路径不正确。
当所指定的配置文件路径不正确时也不会抛出异常,这给调试增加了难度。
4)配置日志类型与使用的方法不一致。
将上面的配置节:
<logger name="ErrorLog">
<level value="Error"/>
<appender-ref ref="ErrorAppender"/>
</logger>
改为下面这样,而其他代码不变,运行程序发现无法写入,但是系统不会抛出异常,也没有任何提示。
<logger name="ErrorLog">
<level value="Info"/>
<appender-ref ref="ErrorAppender"/>
</logger>
5)回滚文件锁定模式
如果如下这么配置,系统会抛异常,但是无法用try-catch捕获,但可在控制台查看到。
<lockingModel type="log4net.Appender.RollingFileAppender+MinimalLock" />
6)写文本文件的问题
若rollingStyle配置节的值为date,那么maxSizeRollBackups、maximumFileSize对日志文件没有任何影响。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在Android源码中编译出指定jar包的操作
- Android Studio 视频播放失败 start called in state1 异常怎么解决
- 解决Android 源码编译错误的问题
- Android 实现列表倒计时功能
- Android 多渠道(友盟)打包教程分享
- Android Broadcast 和 BroadcastReceiver的权限限制方式
- [GO] 变参函数-GO中函数传递变长参数
- 基于Android-Skin-Loader实现换肤效果
- 通过 Nginx 实现最简单的Nas服务器(文件分享)
- 解决Android Studio xml 格式化不自动换行的问题
- GitHub代码仓库服务的那些事
- Android之自定义实现BaseAdapter(通用适配器三)
- Android实现音乐播放器锁屏页
- android studio3.3.1代码提示忽略大小写的设置
- Ascgen2可以把图片变成文字的小工具