写入多线程Log4net 多线程写入
问题描述: 系统经常出现log无缘无故的丧失,每次系统出问题时去查log时发明log没有,愁闷了许久。 今天搞了将近一天,终于搞定。
处理步骤:
- 写了个控制台程序,在while(true)里头调用log,编译后同享文件夹。
- 本机运行程序,log有信息。
- 在另一台机器运行程序,log没有,提示log文件被其他程序使用。原来log4net创建日志文件后,会始终占用此文件,其他程序不能写入。
- 老版本的log4net似乎不支持多线程写入。于是下载log4net 1.2.11 版本的dll,并且appender中加<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
- ok
当浮华给予我们过多欺骗,现实中的虚假几乎让我们忘却了真的存在,是真情唤回了迷离的心,是真情带给了我们最纯、最真的感觉,它流露的是美的誓言,渗透的是永恒执著的真爱。
处理方案总结:于是下载log4net 1.2.11 版本的dll,并且appender中加<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />,问题ok。
这篇讲讲实际产品中最常用到的appender -- RollingFileAppender。
前面讲过FileAppender,应该不难想到,如果一个系统的所有日志都记在一个日志文件里,那岂不是要撑爆了?所以我们真正使用的是RollingFileAppender,它基于时间生成一系列的日志文件,避免单个文件过大的问题。下面是一个经典的RollingFileAppender配置:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="D:\WebTest\" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="10" />
<param name="MaximumFileSize" value="10MB" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyy-MM-dd'.txt'" />
<param name="RollingStyle" value="Composite" />
<param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%M] - Line %L:%m%n" />
</layout>
</appender>
我们从需求的角度反向分析这些配置的细节。
1. 我们的日志要存到哪里?
<param name="File" value="D:\WebTest\" />为我们指定了路径。
2. 日志文件怎么命名?
<param name="DatePattern" value="yyyy-MM-dd'.txt'" />指定文件名的日期格式。如果要加个".txt"的后缀,需要用单引号把它包起来。用"也可以,即下面的写法是等价的:<param name="DatePattern" value="yyyy-MM-dd".txt"" />
<param name="StaticLogFileName" value="false" />指明文件名是变动的。这个设成true的话不能生成rolling的日志文件。
<param name="RollingStyle" value="Composite" />指明文件的命名方式。"Composite"指文件名同时按size和date来命名,一般就用这个。还有其他3个取值:Once(每次程序启动新生成一个)、Size、Date。当RollingStyle=Composite时,如果File参数设为"D:\WebTest\MyLog_" ,那么文件名将是:"MyLog_2015-11-27.txt"。
3. 怎么限定日志文件的大小?
<param name="MaximumFileSize" value="10MB" />限定每个日志文件不超过10M。
4. 日志超过指定大小后会怎样?
<param name="MaxSizeRollBackups" value="10" />表明,到达限制大小后会生成一个新文件,如"2015-11-27.txt.1",依此类推,当生成"2015-11-27.txt.10"之后,再满了就要回头覆盖第一个文件了。
5. 日志以什么方式写?
<param name="AppendToFile" value="true" />说明日志以增量方式写入。设成false就是覆盖模式了。
6. 日志内容的格式可以定义吗?
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%M] - Line %L:%m%n" />
</layout>
layout标签中的ConversionPattern参数可以定义每条消息的格式,比如上面这个意思是:"时间 [线程id] 级别 类名 [方法名] - Line 行号:消息内容+换行符",
例子:2015-11-27 19:18:25,320 [89] ERROR ASP.default_aspx [Page_Load] - Line 9:Hello World!
layout的参数详解会单独用一章来讲。
7. 写日志会影响系统性能吗?
写日志必然是会消耗一定资源的,而RollingFileAppender也不是线程安全的。为了减小log4net影响系统性能的嫌疑,我们加入lockingModel参数,使用FileAppender.MinimalLock来减少并发时发生死锁的概率:
<param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
尽管如此,文件的I/O始终是耗性能的,有没有办法缓存一批日志,然后一次性写入文件呢?BufferingForwardingAppender正是为此而生,我们下章再介绍如何使用它。
---------------------
作者:等不到来世
来源:CSDN
原文:https://blog.csdn.net/szx1999/article/details/50073857
版权声明:本文为博主原创文章,转载请附上博文链接!
写入多线程Log4net 多线程写入的更多相关文章
- C# log4net 日志写入到数据库
原文:C# log4net 日志写入到数据库 效果图: 1:第一步创建SQL表结构 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...
- iOS开发多线程篇—多线程简单介绍
iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...
- swift开发多线程篇 - 多线程基础
swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread 使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...
- Linux多线程编程——多线程与线程同步
多线程 使用多线程好处: 一.通过为每种事件类型的处理单独分配线程,可以简化处理异步事件的代码,线程处理事件可以采用同步编程模式,启闭异步编程模式简单 二.方便的通信和数据交换 由于进程之间具有独立的 ...
- Java多线程——<八>多线程其他概念
一.概述 到第八节,就把多线程基本的概念都说完了.把前面的所有文章加连接在此: Java多线程——<一>概述.定义任务 Java多线程——<二>将任务交给线程,线程声明及启动 ...
- java下DataInputStream与DataOutputStream写入数据的同时写入数据类型
package cn.stat.p2.demo; import java.io.DataInputStream; import java.io.DataOutputStream; import jav ...
- iOS开发多线程篇—多线程简介
iOS开发多线程篇-多线程简介 一.进程和线程 1.什么是进程 进程是指在系统中正在执行的一个应用程序 每一个进程之间是独立的.每一个进程均执行在其专用且受保护的内存空间内 比方同一时候打开QQ.Xc ...
- 【原创】大叔问题定位分享(20)hdfs文件create写入正常,append写入报错
最近在hdfs写文件的时候发现一个问题,create写入正常,append写入报错,每次都能重现,代码示例如下: FileSystem fs = FileSystem.get(conf); Outpu ...
- {python--GIL锁}一 介绍 二 GIL介绍 三 GIL与Lock 四 GIL与多线程 五 多线程性能测试
python--GIL锁 GIL锁 本节目录 一 介绍 二 GIL介绍 三 GIL与Lock 四 GIL与多线程 五 多线程性能测试 一 背景知识 ''' 定义: In CPython, the gl ...
随机推荐
- mybatis之级联关系(一对一、一对多)
0. 表结构 1. 准备工作 1.1 配置文件等信息,请参考 myBatis之入门示例 1.2 entity 1.2.1 TPersonInfo.java package com.blueStarW ...
- linux 学习笔记 finding people
#who 或者 #w 展示所有登录到当前系统的用户信息 #who am i 展示真是用户信息 #whoami 展示登陆系统的用户名 例如 : 登陆用户和真实用户一致 #whoami root #wh ...
- javascript中6种基本数据类型详解
javascript中有5中数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number和String,还有一种复杂数据类型——object,object本质是由一组键值 ...
- javascript事件绑定和普通事件的区别
<!doctype html><html lang="en"><head> <meta charset="UTF-8" ...
- My Web Developer Roadmap
必需技能部分,可以理解为通用的.基础的技能,不管我们选择哪个方向都是通用的,包括但不限于 Git 使用.HTTP/HTTPS.数据结构和算法等.当然了,学习能力是必须具备的. 从一开始学习web前端, ...
- [ZOJ1482]Partitions
[ZOJ1482]Partitions 题目大意: 给定一个\(n\times n(n\le3000)\)的\(\texttt 0/\texttt1\)矩阵,求去掉所有的\(1\)以后,矩阵被分成几个 ...
- MySql 5.7.20版本免安装版配置过程
下载地址为: https://dev.mysql.com/downloads/mysql/ 最下面根据自己的操作系统选择合适的型号 下载完以后解压缩到自定义的路径.这里注意的是路径中不要存在中文. 解 ...
- BZOJ4962 : 简单的字符串
枚举子串的中心,往两侧扩展,将两侧对应位置的字符交替写下来,得到一个字符串$S$. 若前后长度为$L$的子串循环同构,则在$S$中它们对应长度为$2L$的前缀,需要满足它可以由不超过$2$个偶回文串拼 ...
- array中key所对应的value
获取数组中的键对应的值 class Test{ public function index(){ $info = array( 'name' => 'daicr', 'age' => 24 ...
- HDU 2000 ASCII码排序
题目链接:HDU 2000 Description 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符. Input 输入数据有多组,每组占一行,有三个字符组成,之间无空格. Outp ...