关闭

多线程方式下写入系统日志

722人阅读 评论(0) 收藏 举报
分类:

本章节将介绍如何以多线程方式下系统日志,并确保每条日志写入不发生冲突,全部写入日志文件。基本原理,将日志写入日志文件error.log,写入前先判断error.log是否可写,如果不可写则等待,直到成功写入为止。error.log其实就是一个文本文件,当有大量日志同时写入时,日志的先后顺序会受影响,但并不会遗漏日志。

判断日志文件是否可用:

  C# Code
1. public static bool IsFileInUse(string fileName)
2. {
3.     bool inUse = true;
4.     System.IO.FileStream fs = null;
5.     try
6.     {
7.         fs = new System.IO.FileStream(fileName,  System.IO.FileMode.Open,  System.IO.FileAccess.Read,  System.IO.FileShare.None);
8.         inUse = false;
9.     }
10.     catch
11.     {
12.         inUse = true;
13.     }
14.     finally
15.     {
16.         if (fs != null)
17.             fs.Close();
18.     }
19.     return inUse;
20. }

多线程方式写入日志:

  C# Code
1. public static void Log(string str)
2. {
3.     string filePath = @appPath + 'error.log';
4.     string content = DateTime.Now.ToString('yyyyMMddHHmmss:') + str;
5.     if (!System.IO.File.Exists(filePath))
6.     {
7.         System.IO.File.AppendAllText(filePath, content);
8.         return;
9.     }
10.     ParameterizedThreadStart threadStart = new ParameterizedThreadStart(WriteLog);
11.     Thread thread = new Thread(threadStart);
12.     thread.Name = 'WebApp.WriteLog';
13.     thread.Start(str);
14. }

向日志文件写入日志,其中WriteLog的参数str必须是object类型。

  C# Code
1. public static void WriteLog(object str)
2. {
3.     string filePath = @appPath + 'error.log';
4.     string content = '\r\n' + DateTime.Now.ToString('yyyyMMddHHmmss:') + str.ToString();
5.     System.IO.FileInfo info = new System.IO.FileInfo(filePath);
6.     if (info.Length > 1024 * 1024 * 5)
7.     {
8.         while (IsFileInUse(filePath))
9.             Thread.Sleep(100);
10.         System.IO.File.Move(filePath, @appPath + 'error' + DateTime.Now.ToString('yyyyMMdd') + '.log');
11.         System.IO.File.Delete(filePath);
12.     }
13.     while (IsFileInUse(filePath))
14.         Thread.Sleep(100);
15.     if (!IsFileInUse(filePath))
16.     {
17.         #region write file
18.         System.IO.FileStream fs = null;
19.         try
20.         {
21.             fs = new System.IO.FileStream(filePath,  System.IO.FileMode.Append, System.IO.FileAccess.Write,  System.IO.FileShare.None);
22.             fs.Write(Encoding.UTF8.GetBytes(content), 0, Encoding.UTF8.GetByteCount(content));
23.         }
24.         catch
25.         {
26.             ;
27.         }
28.         finally
29.         {
30.             if (fs != null)
31.                 fs.Close();
32.         }
33.         #endregion
34.     }
35. }
1
0
查看评论

C#多线程写日志

C#多线程写日志 标签: 多线程c#stringnewlineexceptionlog4net 2011-06-29 09:05 2477人阅读 评论(4) 收藏 举报  分类:   WinForm(...
  • bgshou
  • bgshou
  • 2016-04-10 20:15
  • 1009

多线程下写日志

鄙人最近遇到了一个奇特的线上事故,记录一下,以备记忆。         鄙人所在的部门负责给公司提供各种基础库,即基础架构部门。最近某别的部门用本部门提供的支持多线程版本的日志库后,出现这样一个奇特的现象:当磁盘被日志写满以后,他们的数据文件的头部被写上了最新...
  • menggucaoyuan
  • menggucaoyuan
  • 2014-10-31 17:00
  • 8605

简单高效的多线程日志类

记录程序运行时的日志是一个很好的
  • sunnyloves
  • sunnyloves
  • 2014-09-12 10:19
  • 2476

5-高效的多线程日志

Please indicate the source: http://blog.csdn.net/gaoxiangnumber1Welcome to my github: https://github.com/gaoxiangnumber1 “日志(logging)”有两个意思: • 诊断日志(d...
  • gaoxiangnumber1
  • gaoxiangnumber1
  • 2017-03-29 15:04
  • 532

多线程、多进程写同一日志情况下的日志库中 I/O 的选型

文件描述符与 inode 相关背景知识 出自《The Linux Programming Interface》 多线程 有上面的背景知识可知,多线程情况下写同一文件用的是同一个【文件偏移量】,因此只要单条写日志操作是原子操作,就不会出现日志混乱的情况。 系统 I/O 系统 I/O write...
  • duyiwuer2009
  • duyiwuer2009
  • 2015-01-29 12:13
  • 1651

多线程打印日志面试题

public class Test { public static void main(String[] args){ System.out.println("begin:"+(System.currentTimeMillis()/1000))...
  • lzm1340458776
  • lzm1340458776
  • 2014-06-01 20:10
  • 905

多线程记录本地数据库日志

静态实例BusiLog类 import org.apache.log4j.Logger; import com.bean.LogInfoBean; import com.common.jdbc.interfaces.JdbcOperation; import com.common.web...
  • luo_yifan
  • luo_yifan
  • 2012-05-10 10:47
  • 1989

多线程程序写日志时遇到加锁的问题

前段时间在做项目时,系统是个多线程程序,几个线程都需要写日志,主线程和通讯线程经常在写日志时打架,为了解决这个问题,考虑在写日志的方法中加锁。代码如下:      ///         /// 写日志时...
  • weizhiai12
  • weizhiai12
  • 2011-09-19 15:24
  • 3228

多线程写到一个日志文件中

在目前的工作中,一直在接触多线程,那么对于多线程的应用方面就会有诸多的问题,一步步来解析,这次先开展第一个问题:日志方面的管理。
  • kwy15732621629
  • kwy15732621629
  • 2017-03-12 10:28
  • 378

Java log4j 配置多个logger写入多个log文件

这里使用的版本为log4j-1.2.15。 一、引言平常开发的过程中,有时不想把所有的日志都打印到同一个log文件中,除了Java工程集成log4J 1.x博文中介绍的使用一个logger,配置多个appender的log4j.appender.D.Threshold属性外,还可以在配置文件log4...
  • tterminator
  • tterminator
  • 2016-12-10 17:41
  • 3002
    个人资料
    • 访问:98179次
    • 积分:2769
    • 等级:
    • 排名:第15298名
    • 原创:172篇
    • 转载:44篇
    • 译文:0篇
    • 评论:15条
    最新评论