开发接口程序时,要保证程序稳定运行就要时刻监控接口程序发送和接收的数据,这就需要一个日志记录的类将需要的信息记录在日志文件中,便于自己维护接口程序。(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日志记录类的更多相关文章

  1. Log 日志工具类 保存到文件 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. 类库里面添加日志记录 log4net

    第一步: 新建一个公共类库common,添加CustomLog4jLogger.cs 并引用log4net.dll /// <summary> /// 日志记录 /// </summ ...

  3. iptables log日志记录功能扩展应用:iptables自动配置临时访问策略,任意公网登录服务器

    一.修改日志记录: 1. 修改配置文件: vi /etc/rsyslog.conf 添加以下内容 #iptables log kern.=notice /var/log/iptables.log 2. ...

  4. python3 log 日志记录

    在调试的过程中,很多地方需要用到日志 如下 import logging LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s&qu ...

  5. Apache关闭VirtualHost的Log日志记录

    有时我们的apache产生的日志是超大的并且 没什么用处,这时我们就可以关闭了,关闭apache日志很简单,直接ErrorLog off或 # CustomLog即可. Web server(ex: ...

  6. php项目中常用的log日志记录方法

    function log_result($str) { if (LOG_WRITEOUT == 1) { $fp = fopen ( "log.txt", "a+&quo ...

  7. 日志记录类LogHelper

    开源日志log4net使用起来很方便,但是项目中不让用,所以自己重写了一个类,用来记录日志,比较简单. 1.首先是可以把日志分成多个类型,分别记录到不同的文件中 /// <summary> ...

  8. 【C#通用类】日志记录类

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...

  9. C#日志记录类

    public class WriteLog { /// <summary> /// 将错误写入文件中 /// </summary> /// <param name=&qu ...

随机推荐

  1. 有趣的JavaScript小程序

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. PHP SPL标准库之SplFixedArray使用实例

    SplFixedArray主要是处理数组相关的主要功能,与普通php array不同的是,它是固定长度的,且以数字为键名的数组,优势就是比普通的数组处理更快. 看看我本机的Benchmark测试: i ...

  3. 企业信息化快速开发平台JeeSite

    网站:http://jeesite.com/ 可用于企业后台管理

  4. CentOS Linux iptables 防火墙

    快速安装,配置,启动,检查 - 关闭 5002 - 5011 端口开放所有其它 yum install iptables iptables -F iptables -X iptables -Z ipt ...

  5. SQL语句在数据库中是如何执行的

    第一步:应用程序把查询SQL语句发给服务器端执行 我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给服务器处理. 第二步:服务器解析请求的SQL语句 SQL计划缓存, ...

  6. fedora 关闭、禁止selinux

    Fedora关闭/禁用SELinux三种方法 在Fedora中有时候我们想关闭SELinux,因为有时候本是合法的操作也总是弹出窗口阻止我们的操作.下面介绍三种方法来关闭/禁用SELinux. 1.在 ...

  7. 熟练使用git命令

    git工作流程图: 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下: Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remo ...

  8. OpenCV3编程入门笔记(5)重要章节小节及核心函数

  9. ASP.NET MVC 5改进了基于过滤器的身份验证

    ASP.NET MVC 5包含在最近发布的Visual Studio 2013开发者预览版中,它使开发人员可以应用身份验证过滤器,它们提供了使用各种第三方供应商或自定义的身份验证提供程序进行用户身份验 ...

  10. Mybatis 学习-2

    创建基于session的util类,在线程中共享SqlSession package cn.smartapp.blogs.pojo; import java.io.Serializable; impo ...