记录日志可以帮助开发人员很快找到问题所在。所以,每个系统中都会有记录日志的功能。本篇文章为大家分享小编正在做的系统中用到的记录日志的方法。
首先,需要下载log4net,并引用。
代码分享
记录日志最主要的部分是配置文件:
<span style="font-family:KaiTi_GB2312;font-size:24px;"><configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<!--定义日志的输出媒介-->
<!--在root中开启或关闭日志-->
<root>
<!--日志存放的地方-->
<level value="Debug"/>
<!--文件形式记录日志-->
<appender-ref ref="RollingLogFileAppender"/> <!--这里的ref是appender中的name-->
<!--控制台控制显示日志-->
<appender-ref ref="ConsoleAppender"/>
</root>
<!--定义输出到文件中-->
<!--将日志以回滚文件的形式写到文件中。-->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<!--定义文件存放位置和日志文件名-->
<file value="log/log4net.txt"/>
<appendToFile value="true"/>
<rollingStyle value="Size"/>
<!--每个日志文件最大100KB-->
<maxSizeRollBackups value="10"/>
<!--每个日志文件最大1000KB-->
<maximumFileSize value="1000kb"/>
<rollingStyle value="size"/>
<staticLogFileName value="true"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<layout type="log4net.Layout.PatternLayout">
<!--每条日志开头和末尾的文字说明-->
<header value="
[============================应用程序日志开始============================ ]
</span><span style="font-family:KaiTi_GB2312;font-size:24px;"> </span><span style="font-family:KaiTi_GB2312;font-size:24px;">" />
</span><span style="font-family:KaiTi_GB2312;font-size:24px;"></span><pre name="code" class="plain"><span style="font-family:KaiTi_GB2312;font-size:24px;"> <footer value="
</span><span style="font-family:KaiTi_GB2312;font-size:24px;"> </span><span style="font-family:KaiTi_GB2312;font-size:24px;">[ ============================应用程序日志结束============================]
</span><span style="font-family:KaiTi_GB2312;font-size:24px;"> </span><span style="font-family:KaiTi_GB2312;font-size:24px;">" />
</span><span style="font-family:KaiTi_GB2312;font-size:24px;"></span><pre name="code" class="plain"><span style="font-family:KaiTi_GB2312;font-size:24px;"></span><pre name="code" class="plain"><span style="font-family:KaiTi_GB2312;font-size:24px;"> <!--%d(datetime):输出当前语句运行的时刻 -->
<!--%t(thread id):当前语句所在的线程ID -->
<!--%c(class):当前日志对象的名称-->
<!--%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息 -->
<!--%n(new line):换行 -->
<conversionPattern value="%d [%t] %c - %m%n"/>
</layout>
</appender></span>
窗体测试代码:
<span style="font-family:KaiTi_GB2312;font-size:24px;">//注意下面的语句一定要加上,指定log4net使用.config文件来读取配置信息
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace TestLog4net
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private log4net.ILog log = log4net.LogManager.GetLogger(typeof(MainWindow));
private void button1_Click(object sender, RoutedEventArgs e)
{
try
{
int a = Convert.ToInt32(textBox1.Text);
int b = Convert.ToInt32(textBox2.Text);
a = b;
}
catch (Exception ex)
{
log.Error("出错了!", ex);
MessageBox.Show("已经写入日志了!", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
}
}
}
}</span>
注意:上面的代码中有这么一句:[assembly: log4net.Config.XmlConfigurator(Watch = true)](在需要使用log4net的类的namespace处), 如果没有这句话,日志就写不进去。这句话是指定log4net使用.config文件来读取配置信息 。
效果图:
问题汇总
代码完成之后,生成解决方案的时,可能会报错:
修改程序属性,将目标框架默认的.NETFramework4 Client Profile修改为.NET Framework4之后再重新生成解决方案就可以了。
若使用的是wpf界面(本人使用的是),修改完成之后,MainWindow.xaml报错:
未找到原因,只是在重复改目标框架后,再次打开,不再报错了。若还不行,需要重新删除,再建项。
配置文件简单介绍:
每个<appender>子节点代表一种记录日志的方式:
AdoNetAppender:利用ADO.NET记录到数据库的日志。
AnsiColorTerminalAppender:在ANSI 窗口终端写下高亮度的日志事件。
AspNetTraceAppender:能用asp.net中Trace的方式查看记录的日志。
BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。
ConsoleAppender:将日志输出到控制台。
EventLogAppender:将日志写到Windows Event Log.
FileAppender:将日志写到文件中。
LocalSyslogAppender:将日志写到local syslog service (仅用于UNIX环境下).
MemoryAppender:将日志存到内存缓冲区。
NetSendAppender:将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。
RemoteSyslogAppender:通过UDP网络协议将日志写到Remote syslog service。
RemotingAppender:通过.NET Remoting将日志写到远程接收端。
RollingFileAppender:将日志以回滚文件的形式写到文件中。
SmtpAppender:将日志写到邮件中。
TraceAppender:将日志写到.NET trace 系统。
UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。
log4net的参数介绍:
%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
%n(new line):换行
%d(datetime):输出当前语句运行的时刻
%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id):当前语句所在的线程ID
%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
%c(class):当前日志对象的名称,例如:
%f(file):输出语句所在的文件名。
%l(line):输出语句所在的行号。
%数字:表示该项的最小长度,如果不够,则用空格填充,如“%-5level”表示level的最小宽度是5个字符,如果实际长度不够5个字符则以空格填充。