为什么使用log4net

有些日志语句只是在开发中用于调试的,不应该在Release版本中输出,log4net通过配置文件可以为Debug和Release不同的模式设置不同的输出级别来控制,而且如果已经发布了,在Release下遇到一些问题,想要查看某些本来在Debug模式下才会输出的日志,可以修改配置文件就会即时生效了(重启程序不是必要的)

代码中使用log4net

先了解log4net定义的日志级别,从上到下,级别由高到低,在配置文件中将可以控制输出级别,低于该级别的日志不会输出。cannot be called表示并非在代码中调用的,而是用于配置文件。

  1. OFF - nothing gets logged (cannot be called)
  2. FATAL 严重的错误,程序应该退出
  3. ERROR 错误,程序无法完成某一个操作
  4. WARN 警告,虽然程序可以完成操作,但是有一些需要留意的事件
  5. INFO 信息,用于跟踪某一流程,仅仅用于关键位置
  6. DEBUG 调试,仅仅用于调试时使用,在完成历史任务后应该从代码中移除
  7. ALL - everything gets logged (cannot be called)

应该遵守这些级别约定,而不能总使用ERROR或者其它的级别。

调用的方法,以Info为例:

0
1
2
logger.Info("hello, world")
logger.InfoFormat("hello, {0}", word)
logger.Info("hello, world", ex) //ex表示异常

一般而言,写日志的时候最好提供某个tag,来表示某些日志属于这一个过程,例如以下日志语句:

0
1
2
[tag0] hello, world
[tag1] I'm handsome
[tag0] world, hello

在跟踪的时候,就可以仅仅查看tag0的日志。在log4net的基础上做了一点小小的封装:

 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Logger
{
public static ILog GetLogger(object o)
{
return log4net.LogManager.GetLogger(o.GetType());
} public static ILog GetLogger(Type type)
{
return log4net.LogManager.GetLogger(type);
} public static ILog GetLogger(string name)
{
return log4net.LogManager.GetLogger(name);
}
} ... //用于实例方法中
Logger.Logger.GetLogger(this).Info("install begin");
//用于静态类的方法中
Logger.Logger.GetLogger(typeof(AdbUtil)).Info("获取IMEI:" + (errno as NIErrno).IMEI);
//显性命名
Logger.Logger.GetLogger("UI").Debug(text);

使用GetLogger(this)虽然很方便,但是并不是最好的做法,应该以跟踪的过程来作为tag,而这个过程往往会跨越多个类的实例。

配置文件示例

使用这种配置方式,在Release模式下无法输出日志:

使用XML配置文件,首先添加以下语句(在using语句块后):

0
[assembly: log4net.Config.XmlConfigurator(Watch = true)]

改为使用这种方式:

0
1
2
3
4
5
6
public class Bar
{
static Bar()
{
XmlConfigurator.Configure();
}
}

看这里:Log4net works in Debug but fails in Release build

不过使用app.config也不能监测配置文件变化:

The System.Configuration API is only available if the configuration data is in the application's config file; the file named MyApp.exe.config or Web.config. Because the System.Configuration API does not support reloading of the config file the configuration settings cannot be watched using the log4net.Config.XmlConfigurator.ConfigureAndWatch methods. The main advantage of using the System.Configuration APIs to read the configuration data is that it requires less permissions than accessing the configuration file directly.

下面的App.config中定义了一个回滚文件日志,包括log.txt本身,还最多会有19个以数字命名的备份文件,而log.txt.1总是时间最近的备份。由于同时限制了单文件大小为1MB,所以日志最多占20MB。生成的文件名没有以日期为文件名,因为RollingFileAppender的Composite的rollingStype,只能针对某一日期,限制这一日期之内的日志大小,而不能限制全部的日志的大小。

 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<appender name="Logger" type="log4net.Appender.RollingFileAppender">
<file value="4SLOG/log.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="20" />
<maximumFileSize value="1MB" />
<staticLogFileName value="true" />
<encoding value="utf-8" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%thread] %logger %date %-5level - %message %location %newline" />
</layout>
</appender> <root>
<level key="log_level" value="ALL" />
<appender-ref ref="Logger" />
</root>
</log4net>
</configuration>

Debug和Release下不同的配置

与Web.config不同,VS是不支持在Debug和Release中使用不同的App.config,需要安装插件:SlowCheetah。一个简单的XML Transform的App.Release.config如下:

 0
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8" ?>
<!-- For more information on using transformations
see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<log4net>
<root>
<level key="log_level" xdt:Transform="Replace" value="INFO" />
</root>
</log4net>
</configuration>

查看log4net的日志

推荐使用LogViewer

参考资料

log4net Tutorial

在c#客户端程序中使用log4net的更多相关文章

  1. Quartz.net 2.x 学习笔记02-Quartz.net 2.x在MVC站点中结合Log4net的使用

    Quartz.net 2.x在MVC站点中结合Log4net的使用 首先新建一个MVC的空站点: 第二步,添加Quartz.net的引用 在搜索处输入quartz.net搜索安装即可(目前是2.3) ...

  2. netcore中使用log4net日志

    第一.控制台程序中使用log4net  static void Main(string[] args) { ILoggerRepository repository = LoggerManager.C ...

  3. ArcGIS客户端API中加载大量数据的几种解决办法

    ArcGIS客户端API中加载大量数据的几种解决办法 2011-03-25 18:17 REST风格的一切事物方兴未艾,ArcGIS Server的客户端API(Javascript/Flex/Sil ...

  4. C#开发BIMFACE系列53 WinForm程序中使用CefSharp加载模型图纸1 简单应用

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在我的博客<C#开发BIMFACE系列52 CS客户端集成BIMFACE应用的技术方案>中介绍了多种集成BIM ...

  5. WCF中修改接口或步骤名称而不影响客户端程序

    WCF中修改接口或方法名称而不影响客户端程序 本篇接着"从Web Service和Remoting Service引出WCF服务"中有关WCF的部分. 运行宿主应用程序. 运行We ...

  6. 在net安装程序中部署oracle客户端全攻略

    在net安装程序中部署oracle客户端全攻略 主要的是要做三件工作: 打包文件,写注册表,注册环境变量说明:我的oracle版本为9, 在2000 advanced server 上测试通过,可以正 ...

  7. 在 ServiceModel 客户端配置部分中,找不到引用协定“IpsBarcode.ScanService”的默认终结点元素。这可能是因为未找到应用程序的配置文件,或者是因为客户端元素中找不到与此协定匹配的终结点元素。

    一个类库引用了web service A,用另一个EXE做承载时,访问这个web service A时就提示:“在 ServiceModel 客户端配置部分中,找不到引用协定“IpsBarcode.S ...

  8. 请教如何改善C#中socket通信机客户端程序的健壮性

    我是做Socket的新手,最近做了一个Socket客户端程序,连接Server的时候,如果server存在,并且允许连接的话,程序无错,正常执行:但是如果Server不存在,或者拒绝连接,程序就会卡住 ...

  9. 在web应用程序中使用MemcachedClient

    本文来自:http://www.cnblogs.com/yukaizhao/archive/2008/11/10/memcached_client_usage.html 一. 背景: 在大访问量的we ...

随机推荐

  1. keras—神经网络CNN—CIFAR_10图像识别

    1 from keras.datasets import cifar10 from keras.utils import np_utils import matplotlib.pyplot as pl ...

  2. jsp页面遍历List<Array>与Map

    数据结构下如图所示,之前的前辈遍历方法如下,代码直接抛异常哈, <c:if test="${!empty data1}"> <c:forEach items=&q ...

  3. 使用PHP-GTK编写一个windows桌面应用程序

    PHP-GTK的下载地址:http://gtk.php.net/download.php?language=en-US, 猿哥选择了最新版本(beta版),可能有人会问我们为啥不选最新的stable版 ...

  4. 局域网代理通过wget下载

    下载方法: wget -r -p -np -k http://ftp.loongnix.org/os/Fedora13-o32/RPMS/mipsel/ -r,  --recursive(递归)    ...

  5. TPM、read counts、RPKM/FPKM你选对了吗?

    TPM.read counts.RPKM/FPKM你选对了吗? 已有 3940 次阅读 2017-12-15 15:04 |个人分类:RNA-seq|系统分类:科普集锦|关键词:RNA-seq| RN ...

  6. python while语句写法

    count=5 while count>0: print 'i love python' count=count-1 else: print 'over'

  7. 【Sikuli】Sikuli 文档

    http://sikulix-2014.readthedocs.io/en/latest/index.html

  8. Jmeter Ant Task如果报告中有错误,在邮件内容里面直接显示出来 系列2

    由于部门有多个项目,将自动化测试框架运用于多个项目时,希望针对每个项目修改的东西越少越好,为此,做如下修改: D:\apache-jmeter-2.7\extras\jmeter-results-de ...

  9. Proximal Algorithms

    1. Introduction Much like Newton's method is a standard tool for solving unconstrained smooth minimi ...

  10. const stirng* 类型的指针cp,当cout<<*cp<<endl:会提示没有与之匹配的“<<”运算符

    #include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> usin ...