在c#客户端程序中使用log4net
为什么使用log4net
有些日志语句只是在开发中用于调试的,不应该在Release版本中输出,log4net通过配置文件可以为Debug和Release不同的模式设置不同的输出级别来控制,而且如果已经发布了,在Release下遇到一些问题,想要查看某些本来在Debug模式下才会输出的日志,可以修改配置文件就会即时生效了(重启程序不是必要的)
代码中使用log4net
先了解log4net定义的日志级别,从上到下,级别由高到低,在配置文件中将可以控制输出级别,低于该级别的日志不会输出。cannot be called表示并非在代码中调用的,而是用于配置文件。
- OFF - nothing gets logged (cannot be called)
- FATAL 严重的错误,程序应该退出
- ERROR 错误,程序无法完成某一个操作
- WARN 警告,虽然程序可以完成操作,但是有一些需要留意的事件
- INFO 信息,用于跟踪某一流程,仅仅用于关键位置
- DEBUG 调试,仅仅用于调试时使用,在完成历史任务后应该从代码中移除
- 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
参考资料
在c#客户端程序中使用log4net的更多相关文章
- Quartz.net 2.x 学习笔记02-Quartz.net 2.x在MVC站点中结合Log4net的使用
Quartz.net 2.x在MVC站点中结合Log4net的使用 首先新建一个MVC的空站点: 第二步,添加Quartz.net的引用 在搜索处输入quartz.net搜索安装即可(目前是2.3) ...
- netcore中使用log4net日志
第一.控制台程序中使用log4net static void Main(string[] args) { ILoggerRepository repository = LoggerManager.C ...
- ArcGIS客户端API中加载大量数据的几种解决办法
ArcGIS客户端API中加载大量数据的几种解决办法 2011-03-25 18:17 REST风格的一切事物方兴未艾,ArcGIS Server的客户端API(Javascript/Flex/Sil ...
- C#开发BIMFACE系列53 WinForm程序中使用CefSharp加载模型图纸1 简单应用
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在我的博客<C#开发BIMFACE系列52 CS客户端集成BIMFACE应用的技术方案>中介绍了多种集成BIM ...
- WCF中修改接口或步骤名称而不影响客户端程序
WCF中修改接口或方法名称而不影响客户端程序 本篇接着"从Web Service和Remoting Service引出WCF服务"中有关WCF的部分. 运行宿主应用程序. 运行We ...
- 在net安装程序中部署oracle客户端全攻略
在net安装程序中部署oracle客户端全攻略 主要的是要做三件工作: 打包文件,写注册表,注册环境变量说明:我的oracle版本为9, 在2000 advanced server 上测试通过,可以正 ...
- 在 ServiceModel 客户端配置部分中,找不到引用协定“IpsBarcode.ScanService”的默认终结点元素。这可能是因为未找到应用程序的配置文件,或者是因为客户端元素中找不到与此协定匹配的终结点元素。
一个类库引用了web service A,用另一个EXE做承载时,访问这个web service A时就提示:“在 ServiceModel 客户端配置部分中,找不到引用协定“IpsBarcode.S ...
- 请教如何改善C#中socket通信机客户端程序的健壮性
我是做Socket的新手,最近做了一个Socket客户端程序,连接Server的时候,如果server存在,并且允许连接的话,程序无错,正常执行:但是如果Server不存在,或者拒绝连接,程序就会卡住 ...
- 在web应用程序中使用MemcachedClient
本文来自:http://www.cnblogs.com/yukaizhao/archive/2008/11/10/memcached_client_usage.html 一. 背景: 在大访问量的we ...
随机推荐
- postman 使用 - 连接不到接口
- OC -网络请求 - NSURLConnection - GET
#import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> ...
- 转 git push 提示 Everything up-to-date
git 还没有分支,需要指定一个($ git remote -v),就可以push了 第一步:$ git remote -v 第二步:$ git branch 转载链接: http://blog.cs ...
- linux下一些常用系统命令
查看系统打开的文件数 lsof|wc -l 查看当前目录下的文件数 find -type f | wc -l 查看某个目录下的文件数,注意这里/home包括其所有子目录 find /home -typ ...
- com.opensymphony.xwork2.config.ConfigurationManager.addConfigurationProvider
一月 31, 2016 5:06:31 下午 org.apache.catalina.core.StandardContext filterStart 严重: Exception starting f ...
- mathematica9激活
1.打开m9软件 2.打开keygen软件 3.点手动输入验证码,输入里面的id到keygen软件再点save mathpath 4.复制keygen软件里面 的mathpass到 将生成的mathp ...
- 刷新物化视图sql
在plsql中新建command window,执行如下语句: exec dbms_mview.refresh('V_CTRL_POINT_PLAN_DATE'); -- V_CTRL_POINT ...
- db2 存储过程中的玩意
aix的top是topas.vmstat也是一个玩意,但是不懂. AND C_DEP_CDE like substr(I_C_DPT_CDE,1,2)||'%';--db2中字符串的加法用||这个 ...
- 如何通过cmd命令进入到某个硬盘的文件夹
1.使用快捷键win+R打开运行窗口,并输入cmd回车 2.进入到某个磁盘:在命令提示符中输入d:(代表的的是进入D盘的根目录)并回车 3.接着在cmd中输入dir(dir是directory目录的简 ...
- 2018.10.21 codeforces1071B. Minimum path(dp+贪心+bfs)
传送门 唉考试的时候写错了两个细节调了一个多小时根本没调出来. 下来又调了半个小时才过. 其实很简单. 我们先dpdpdp出最开始最多多少个连续的aaa. 然后对于没法继续连续下去的用贪心+bfsbf ...