为什么使用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. 如何搭建hibernate框架

    我写这篇博客,主要是想让大家能够快速上手hibernate,本人建议学习框架,应该一个框架一个框架学习,别一上手就三大框架整合,学习之类的.这里只是单独搭建hibernate框架,让大家 能够更好的上 ...

  2. 51. N-Queens (Array; Back-Track, Bit)

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  3. Java获取资源文件

    比如我们有以下目录 |--project |--src |--javaapplication |--Test.java |--file1.txt |--file2.txt |--build |--ja ...

  4. IIS7web服务器调试ASP.net程序遇到的一些故障的解决办法

    1. [由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面] 故障描述:[由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面] ...

  5. LocalBroadcastManager 的使用

    一.使用本地广播发送一条广播(本例为自己发送自己接收,本地广播也可以是其他应用接收)然后接收到广播时回调Receiver类中的回调方法onReceive()在此方法中自定义发出通知 代码 packag ...

  6. eclipse中导入dtd文件实现xml的自动提示功能

    以mybatis为例 1.mybatis的xml文件头: (1)config文件: <?xml version="1.0" encoding="UTF-8" ...

  7. HDU_5688

    /* 度熊所居住的 D 国,是一个完全尊重人权的国度.以至于这个国家的所有人命名自己的名字都非常奇怪.一个人的名字由若干个字符组成,同样的,这些字符的全排列的结果中的每一个字符串,也都是这个人的名字. ...

  8. AMD、CMD、UMD 模块的写法

    简介 最近几年,我们可以选择的Javascript组件的生态系统一直在稳步增长.虽然陡增的选择范围是极好的,但当组件混合匹配使用时就会出现很尴尬的局面.开发新手们会很快发现不是所有组件都能彼此“和平相 ...

  9. ubuntu系统下安装pyspider:搭建pyspider服务器新手教程

    首先感谢“巧克力味腺嘌呤”的博客和Debian 8.1 安装配置 pyspider 爬虫,本人根据他们的教程在ubuntu系统中进行了实际操作,发现有一些不同,也出现了很多错误,因此做此教程,为新手服 ...

  10. 2018.10.20 NOIP模拟 巧克力(trie树+dfs序+树状数组)

    传送门 好题啊. 考虑前面的32分,直接维护后缀trietrietrie树就行了. 如果#号不在字符串首? 只需要维护第一个#前面的字符串和最后一个#后面的字符串. 分开用两棵trie树并且维护第一棵 ...