Log4Net与Log2Console配合时中文问题的解决
二者搭配,非常好用,但必须要用log4net.Layout.XmlLayoutSchemaLog4j才能有效果:区分不同的级别,把不同的属性列都显示出来…
关于Layout参见:http://www.cnblogs.com/wangchunlan2004/articles/609100.html
排版员 特长 ExceptionLayout 对LoggingEvent中的异常信息message进行排版 PatternLayout 最常用的排版员,通过一堆标识符来决定版式。 如:"%date %-5level- %message" 表示要以此输出日志日期、级别(5个字母的宽度)、信息 SimpleLayout 最简单的版式: [level] - [message] XmlLayout 把日志写到XML文件中去,写成一个Element XmlLayoutSchemaLog4j 把日志写到XML文件中去,写成一个Element,其格式需符合log4j对事件定义的DTD. ----------------------------------------------------------------------------------------------- 用常用的patterlayout只能显示一个内容。 这个帖子提到了重新构造一个自己的Layout,http://www.cnblogs.com/seekerlee/archive/2009/06/01/1494067.html,还提供了源码,下载下来试了半天,有一个LogMessage找不到,总是通不过。改了代码后,编译出dll来,用了也没有效果。
发现有人遇到类似问题http://www.yacosoft.com/article.asp?id=44,
问题出现原因:源代码问题出在 UtilTransform.cs 文件 public static string MaskXmlInvalidCharacters ( string textData, string mask ) 这个函数上. 这个函数本意是将输出消息中的无效字符替换为"?".但是不幸的是这个正则写的有问题 private static Regex INVALIDCHARS = new Regex ( @"[^x09x0Ax0Dx20-xFFu00FF-u07FFuE000-uFFFD]", RegexOptions.Compiled ); 这个正则将很大一部分字符都替换掉了,其中就包含中文,还有日文韩文等 解决办法:我直接把正则替换那句话注释掉了.然后重新编译生成,搞定
还有Japanese也有类似问题,https://issues.apache.org/jira/browse/LOG4NET-229。解决办法都提到了源码的Transform.cs。
但是,这个开源的东西是1.0的老代码,我试了很多次,反复研究http://logging.apache.org/log4net/release/building.html才算搞定。
Visual Studio 2005 Open the Visual Studio .NET 2002 solution file as above. Visual Studio will convert the solution and project files to Visual Studio .NET 2003 format. After converting the log4net project you must change the Conditional compilation symbols specified for the log4net project. Open the project properties page and select the Build sheet. Replace the NET_1_0 symbol with NET_2_0. Remember to do this for both Debug and Release configurations. In addition the log4net project requires the following new references:
- System.Configuration
要点是:
- 转换项目(src下的sln)
- 删除test项目,没有心情搞nunit了
- 右键单击log4net项目,配置中的NET_1_0改为NET_2_0
- 引用中添加一个System.configuration
编译就能通过了。
- iOS @property探究(一): 基础详解你要知道的@property都在这里
- 在创建带输出参数和返回值的存储过程时---犯下的一个低级错误
- iOS block探究(二): 深入理解你要知道的block都在这里
- 使用开源人脸特征提取器进行脸部颜值评分
- iOS @property探究(二): 深入理解你要知道的@property都在这里
- iOS block探究(一): 基础详解你要知道的block都在这里
- 在不动用sp_configure的情况下,如何 =》去掉列的自增长,并保留原数据
- iOS runtime探究(一): 从runtime开始理解面向对象的类到面向过程的结构体你要知道的runtime都在这里
- iOS runtime探究(二): 从runtime开始深入理解OC消息转发机制你要知道的runtime都在这里
- SpringMVC 启动流程及相关源码分析你要知道的SpringMVC启动流程和源码分析都在这里
- iOS runtime探究(四): 从runtiem开始实践Category添加属性与黑魔法method swizzling你要知道的runtime都在这里
- C# 复制PDF页面到另一个PDF文档
- Java8 Lambda表达式与Stream API (一):Lambda表达式你要知道的Java8 匿名内部类、函数式接口、lambda表达式与Stream API都在这里
- iOS runtime探究(五): 从runtime开始深入weak实现机理你要知道的runtime都在这里
- 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 数组属性和方法
- Cypress系列(63)- 使用 Custom Commands
- Python字符串操作大全
- Cypress系列(64)- 数据驱动策略
- 别只会搜日志了,求你懂点原理吧
- Cypress系列(65)- 测试运行失败自动重试
- CentOS7下编译FFMPEG源代码
- Android 的 Presentation 双屏异显,遇到的问题总结
- 音视频相关开发库和资料
- Flink深入浅出: 应用部署与原理图解(v1.11)
- 用 Github Actions 在 K8S 中运行 CI 测试
- 线程池的拒绝策略
- 15 张图带你深入理解浮点数
- 用Python实现坦克大战游戏 | 干货贴
- hexo搭建个人网站博客完全教程
- 快速入门 Python 数据库操作