问题描述: 系统经常出现log无缘无故的丧失,每次系统出问题时去查log时发明log没有,愁闷了许久。 今天搞了将近一天,终于搞定。

处理步骤:

  1. 写了个控制台程序,在while(true)里头调用log,编译后同享文件夹。
  2. 本机运行程序,log有信息。
  3. 在另一台机器运行程序,log没有,提示log文件被其他程序使用。原来log4net创建日志文件后,会始终占用此文件,其他程序不能写入。
  4. 老版本的log4net似乎不支持多线程写入。于是下载log4net 1.2.11 版本的dll,并且appender中加<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  5. 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"的后缀,需要用单引号把它包起来。用&quot;也可以,即下面的写法是等价的:<param name="DatePattern" value="yyyy-MM-dd&quot;.txt&quot;" />

<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 多线程写入的更多相关文章

  1. 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 ...

  2. iOS开发多线程篇—多线程简单介绍

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  3. swift开发多线程篇 - 多线程基础

    swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread  使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...

  4. Linux多线程编程——多线程与线程同步

    多线程 使用多线程好处: 一.通过为每种事件类型的处理单独分配线程,可以简化处理异步事件的代码,线程处理事件可以采用同步编程模式,启闭异步编程模式简单 二.方便的通信和数据交换 由于进程之间具有独立的 ...

  5. Java多线程——<八>多线程其他概念

    一.概述 到第八节,就把多线程基本的概念都说完了.把前面的所有文章加连接在此: Java多线程——<一>概述.定义任务 Java多线程——<二>将任务交给线程,线程声明及启动 ...

  6. java下DataInputStream与DataOutputStream写入数据的同时写入数据类型

    package cn.stat.p2.demo; import java.io.DataInputStream; import java.io.DataOutputStream; import jav ...

  7. iOS开发多线程篇—多线程简介

    iOS开发多线程篇-多线程简介 一.进程和线程 1.什么是进程 进程是指在系统中正在执行的一个应用程序 每一个进程之间是独立的.每一个进程均执行在其专用且受保护的内存空间内 比方同一时候打开QQ.Xc ...

  8. 【原创】大叔问题定位分享(20)hdfs文件create写入正常,append写入报错

    最近在hdfs写文件的时候发现一个问题,create写入正常,append写入报错,每次都能重现,代码示例如下: FileSystem fs = FileSystem.get(conf); Outpu ...

  9. {python--GIL锁}一 介绍 二 GIL介绍 三 GIL与Lock 四 GIL与多线程 五 多线程性能测试

    python--GIL锁 GIL锁 本节目录 一 介绍 二 GIL介绍 三 GIL与Lock 四 GIL与多线程 五 多线程性能测试 一 背景知识 ''' 定义: In CPython, the gl ...

随机推荐

  1. Ajax技术使用之ajax与模态框结合的妙用

    Ajax技术使用之ajax与模态框结合的妙用 要求: 使用ajax的方式提交数据:https://www.cnblogs.com/-wenli/p/10470063.html 使用模态框完成增加数据, ...

  2. 李宏毅机器学习笔记4:Brief Introduction of Deep Learning、Backpropagation(后向传播算法)

    李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...

  3. lvs三种模式的配置

  4. BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)

    BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...

  5. Mac如何彻底卸载Mysql

    因为工作变动,到新公司需要安装开发环境,因为电脑是我的“前任”在使用,一般的开发环境都有,就直接上手代码,连接公司数据库.直到某天打算自己写点东西,连接本地的mysql,发现navicat怎么都连接不 ...

  6. Cesium Up and Running Error: Cannot find module 'express'

    在node server.js之前需要npm install,如下: npm install -d

  7. = =用createJS写个flyppyPeople

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 最近flyppybird很流行啊,今天中午闲着没事干,就用现有的素材写了个flyppyPeople,因为角色是个人,所以就叫People啦 ...

  8. vmware ubuntu重置root密码

    1.重启ubuntu,按住shift(开机启动时) 2.选择recovery mode,enter 3.root选择root drop to root shell prompt 4.进入shell界面 ...

  9. 回文检测 [USACO Training Section 1.3]

    题目描述 据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文.你的工作就是去寻找这些牛制造的奇观(最棒的回文). 在寻找回文时不用理睬那些标点符号.空格( ...

  10. 解决 main(int argc, char** argv)这种情况下通过命令行传参,改为main函数里面给定参数。

    本文是原创文章,未经允许,请勿转载. 原来程序中是通过运行exe,然后加上参数,然程序运行起来的.也就是main(int argc, char** argv)这里是通过argv参数是从命令行 传过来的 ...