【个人使用.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 ...
随机推荐
- (六)C语言之typedef详解
1.typedef可以看作type define的缩写,顾名思义就是类型定义,也就是说它只是给已有的类型重新定义了一个方便使用的别名,并没有产生新的数据类型.typedef的使用与宏定义define有 ...
- iOS——Xcode中添加第三方库
一.只有.h和.a文件的库 1.向项目中添加三方库文件 如果添加的第三方库只有.h和.a文件,直接把文件夹拖进项目下面,这时会弹出下面的提示框,一定要勾选下面选择的选项: 这里要注意,在Add to ...
- Winform_播放声音文件
1.调用非托管的dll using System.Runtime.InteropServices; //DllImport命名空间的引用 class test //提示音 { [DllImport ...
- phalcon: plugin 结合Manager事件管理、dispatcher调度控制器 监听sql日志记录或其他拦截出来
可能用到的类 phalcon\mvc\use\plugin Phalcon\Mvc\Dispatcher as MvcDispatcher Phalcon\Events\Manager as Even ...
- phalcon: 官方多模块
目录结构如下 public/index.php: use Phalcon\Mvc\Router; use Phalcon\Tag; use Phalcon\Mvc\Url; use Phalcon\M ...
- DIY_hlstudio_WIN7PE【69M】网络版【89M】
DIY_hlstudio_WIN7PE[69M]网络版[89M] hlstudio的骨头版PE非常精简,由于启动方式和用法不同,个人进行了如下修改:1.原来的合盘修改为bootmgr直接起动ISO镜像 ...
- C++疑难杂症
1.如果在类成员函数外部显示的调用其父类的某个接口. 2.对于一个父类的成员, 子类如何在构造函数中对其进行特殊的定制生成. 3.对于一个需要用常量来声明的类型, 如何定义这个常量. 比如int ...
- DirectX小记
1.关于SetViewPort 如果不调用SetViewPort,那么设备对应的ViewPort是什么. 2.关于多线程渲染 如果逻辑线程和渲染线程分开, 则存在两种渲染方式 a.逻辑线程一次性提交渲 ...
- Android屏幕适配原理
几个概念: 1) 屏幕密度(dpi) :dot per inch,即每英寸像素数. ldpi(120),mdpi(160),hdpi(240),xhdpi(320) 计算方法: 以480x854,4. ...
- HTTP Content-Type的作用
在用java的 AsyncHttpClient与服务器通信时,忘记设置了 Content-Type的值,开始以为没有问题,使用默认的值就行 后面出现了问题.查资料发现,Content-Type是用在M ...