【个人使用.Net类库】(2)Log日志记录类
开发接口程序时,要保证程序稳定运行就要时刻监控接口程序发送和接收的数据,这就需要一个日志记录的类将需要的信息记录在日志文件中,便于自己维护接口程序。(Web系统也是如此,只是对应的日志实现比这个要复杂一点)。
刚开始考虑的比较少,没有加入控制日志文件数量的功能。运行了一段时间,文件夹内的Log文件如下所示:

如果是这样,那运行一年不就三百多个日志文件了,想一想这太可怕了。通过查找资料,发现.Net中的FileInfo存有文件的信息(包括名称,创建时间,文件大小等),那就自己定义一个文件比较器实现文件按照名称降序排序(采用降序是因为要保留近期的Log文件)。文件比较强实现的类如下所示:
using System;
using System.Collections;
using System.IO;
namespace DotNetCommon.Logger
{
/// <summary>
/// 实现IComparer接口,实现文件按名称降序排序
/// </summary>
class FileSorter:IComparer
{
/// <summary>
/// 继承IComparer接口必须实现的方法
/// </summary>
/// <param name="x">FileInfo文件x</param>
/// <param name="y">FileInfo文件y</param>
/// <returns></returns>
public int Compare(object x, object y)
{
if (x == null && y == null)
;
;
;
var xInfo = (FileInfo) x;
var yInfo = (FileInfo) y;
//按名称降序排序
return String.Compare(yInfo.FullName, xInfo.FullName, StringComparison.Ordinal);
}
}
}
接下来就是实现日志文件自动删除。具体思路是,当创建一个新的日志文件时,检测是否超出最大日志允许数量。若超出,使用上面定义的比较器删除之。日志自动删除代码方法如下:
/// <summary>
/// 删除Log目录多余的日志文件
/// </summary>
public void DeleteUnnecessaryLogFiles()
{
var path = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + @"Log\");
var fileInfos = path.GetFiles("*.log");
Array.Sort(fileInfos, new FileSorter());
)) return;
; i < fileInfos.Length; i++)
{
var filepath = fileInfos[i].FullName;
if (!File.Exists(filepath)) continue;
try
{
File.Delete(filepath);
}
catch (Exception)
{
return;
}
}
}
Log日志类具体代码如下所示:
using System;
using System.IO;
using System.Text;
namespace DotNetCommon.Logger
{
/// <summary>
/// 类说明:日志记录(文本记录和byte数组记录)
/// 编码人:鞠小军
/// 联系方式:binghuojxj@qq.com
/// </summary>
class Log
{
/// <summary>
/// 程序当前目录
/// </summary>
private readonly DirectoryInfo _dir = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);
/// <summary>
/// 默认日志文件最大数量为20
/// </summary>
;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="maxLogNum">Log目录下日志文件的最大数量</param>
public Log(int maxLogNum)
{
_maxLogNum = maxLogNum;
}
/// <summary>
/// 字符串写入日志文件
/// </summary>
/// <param name="msg">写入的字符串文本</param>
public void WriteLog_Txt(string msg)
{
FileStream stream = null;
var sb = new StringBuilder();
var path = _dir + "Log";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
var str2 = path + @"\" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";
sb.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " ");
sb.Append(msg);
var bytes = Encoding.UTF8.GetBytes(sb + "\r\n");
try
{
if (!File.Exists(str2))
DeleteUnnecessaryLogFiles();
stream = File.OpenWrite(str2);
stream.Position = stream.Length;
stream.Write(bytes, , bytes.Length);
}
catch (Exception exception)
{
Console.WriteLine("文件打开失败{0}", exception.Message);
}
finally
{
if (stream != null) stream.Close();
}
}
/// <summary>
/// 字节数组写入日志文件
/// </summary>
/// <param name="msg">提示信息</param>
/// <param name="data">字节数组</param>
public void WriteLog_Bytes(string msg, byte[] data)
{
FileStream stream = null;
var sb = new StringBuilder();
var path = _dir + @"\Log";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
var str2 = path + @"\" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";
sb.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " ");
sb.Append(msg);
foreach (var num in data)
{
sb.AppendFormat("{0:x2} ", num);
}
var bytes = Encoding.UTF8.GetBytes(sb + "\r\n");
try
{
if (!File.Exists(str2))
DeleteUnnecessaryLogFiles();
stream = File.OpenWrite(str2);
stream.Position = stream.Length;
stream.Write(bytes, , bytes.Length);
}
catch (Exception exception)
{
Console.WriteLine("文件打开失败{0}", exception.Message);
}
finally
{
if (stream != null) stream.Close();
}
}
/// <summary>
/// 删除Log目录多余的日志文件
/// </summary>
public void DeleteUnnecessaryLogFiles()
{
var path = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + @"Log\");
var fileInfos = path.GetFiles("*.log");
Array.Sort(fileInfos, new FileSorter());
)) return;
; i < fileInfos.Length; i++)
{
var filepath = fileInfos[i].FullName;
if (!File.Exists(filepath)) continue;
try
{
File.Delete(filepath);
}
catch (Exception)
{
return;
}
}
}
}
}
当前日志类不够完善,我还没有加上文件超过固定大小(如超出2M)自动创建新文件等等必要的功能,后续会逐渐完善。大家有什么好建议,欢迎大家拍砖,哈哈。
【个人使用.Net类库】(2)Log日志记录类的更多相关文章
- Log 日志工具类 保存到文件 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 类库里面添加日志记录 log4net
第一步: 新建一个公共类库common,添加CustomLog4jLogger.cs 并引用log4net.dll /// <summary> /// 日志记录 /// </summ ...
- iptables log日志记录功能扩展应用:iptables自动配置临时访问策略,任意公网登录服务器
一.修改日志记录: 1. 修改配置文件: vi /etc/rsyslog.conf 添加以下内容 #iptables log kern.=notice /var/log/iptables.log 2. ...
- python3 log 日志记录
在调试的过程中,很多地方需要用到日志 如下 import logging LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s&qu ...
- Apache关闭VirtualHost的Log日志记录
有时我们的apache产生的日志是超大的并且 没什么用处,这时我们就可以关闭了,关闭apache日志很简单,直接ErrorLog off或 # CustomLog即可. Web server(ex: ...
- php项目中常用的log日志记录方法
function log_result($str) { if (LOG_WRITEOUT == 1) { $fp = fopen ( "log.txt", "a+&quo ...
- 日志记录类LogHelper
开源日志log4net使用起来很方便,但是项目中不让用,所以自己重写了一个类,用来记录日志,比较简单. 1.首先是可以把日志分成多个类型,分别记录到不同的文件中 /// <summary> ...
- 【C#通用类】日志记录类
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...
- C#日志记录类
public class WriteLog { /// <summary> /// 将错误写入文件中 /// </summary> /// <param name=&qu ...
随机推荐
- 如何查看与刷新DNS本地缓存
如何查看与刷新DNS本地缓存 一.查看DNS本地缓存 在cmd窗口输入:ipconfig/displaydns 二.刷新DNS本地缓存 在cmd窗口输入:ipconfig/flushdns 之后输入: ...
- hdu 1005 简单题
今早水出的第一道题,带着情绪做的,竟然1Y了,确实惊奇.这道简单的线性递推取模,直接递推是不行的,因为n的规模达到了100,000,000,要么超时要么超内存.可以用矩阵快速幂来搞,根据题意构建出对应 ...
- PHP中file_put_contents追加和换行
在PHP的一些应用中需要写日志或者记录一些信息,这样的话.可以使用fopen(),fwrite()以及 fclose()这些进行操作.也可以简单的使用file_get_contents()和file_ ...
- 【CDN】域名无法访问,ping不到,tracert不到
背景:香港服务器,CDN服务商:Incapsula 1.首先猜测,域名是否被墙 原因:ip可以直接访问到网站,其他域名指向服务器也可访问 排查:1)首先理解,怎样才算被墙:大陆外可以通过该域名访问,大 ...
- LTIB常用命令3
http://blog.csdn.net/junht/article/details/7656540 LTIB 中的包 4.3.1 查看哪些包是使能的,并且可以安装 在配置ltib之前,您可以在一个 ...
- modernizer的意义
modernizer是一个js文件,会检查当前的浏览器支持什么特性,就在Html标签上添加什么类,然后如果不支持添加no-xxx类,这样,就可以针对两种情况写两种css. http://blog.ch ...
- ulua slua 下载地址
ulua http://www.yanyulin.info/pages/2015/01/27193946190814.html http://www.manew.com/blog-27966-25 ...
- python自定义函数大全
写的零碎的python脚本太多了,到一定阶段就会出现一个问题,即以前写过的脚本找不到了,现在临时要用,还得再重写一遍,这就非常难受了,代码不能复用. 还好我有一个比较好的习惯,我喜欢把python脚本 ...
- RemoteWebDriver管理
直接贴代码: @Parameters({"BrowserType","NodeIP","NodePort"}) public void be ...
- C#程序以管理员权限运行【我采用了第二种,比较好用】
在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况下也无法对系统目录.系统注册表 ...