问题描述: 系统经常出现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. TF:Tensorflow定义变量+常量,实现输出计数功能—Jason niu

    #TF:Tensorflow定义变量+常量,实现输出计数功能 import tensorflow as tf state = tf.Variable(0, name='Parameter_name_c ...

  2. Unity容器中AOP应用示例程序

    转发请注明出处:https://www.cnblogs.com/zhiyong-ITNote/p/9127001.html 实在没有找到Unity容器的AOP应用程序示例的说明,在微软官网找到了教程( ...

  3. 有关python 函数参数

    # def foo(x):# print(x)### foo(1)# foo('a')# foo({'a':2}) #形参与实参:# def foo(x,y): #x=1,y=2# return x+ ...

  4. 前面的内容 也是要去掉白名单 和 8.8.8.8这种非问题IP的 高风险 么? (目前我们没有获取客户的中风险、低风险数据,可以处理掉高风险)

    前面的内容 也是要去掉白名单  和 8.8.8.8这种非问题IP的 高风险 么?   (目前我们没有获取客户的中风险.低风险数据,可以处理掉高风险) == 整体把关.不清楚细节,所以只能从整体决策.做 ...

  5. elementUI的table组件实现setCurrentRow的滚动条定位效果

    在github上咨询了,直接给了代码: https://jsfiddle.net/tk37c5cb/14/

  6. Codeforces.348D.Turtles(容斥 LGV定理 DP)

    题目链接 \(Description\) 给定\(n*m\)的网格,有些格子不能走.求有多少种从\((1,1)\)走到\((n,m)\)的两条不相交路径. \(n,m\leq 3000\). \(So ...

  7. BZOJ3324 : [Scoi2013]火柴棍数字

    为了使数字最大,首先要最大化其位数. 设$f[i][j][k]$表示从低到高考虑了$i$位,手头火柴棍个数为$j$,第$i$位是不是$0$时,最少移动多少根火柴. 若$f[i][0][非0]\leq ...

  8. pythonweb服务器编程(三)

    Web静态服务器-2-显示需要的页面 #coding=utf-8 import socket from multiprocessing import Process import re def han ...

  9. python网络编程(六)

    tcp通信模型 tcp服务器 在程序中,如果想要完成一个tcp服务器的功能,需要的流程如下: socket创建一个套接字 bind绑定ip和port listen使套接字变为可以被动链接 accept ...

  10. BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP

    题意参见BZOJ3522 n<=100000 数据范围增强了,显然之前的转移方程不行了,那么不妨换一种. 因为不能枚举根来换根DP,那么我们描述的DP方程每个点要计算三个点都在这个点的子树内的方 ...