ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Log4NET 日志分割删除与压缩解决思路(附源码)

2022-08-20 10:30:44  阅读:163  来源: 互联网

标签:Log4NET string zipStream sourceFilePath 源码 File new 日志 文件夹


最近公司发现,日志产生的太多了,于是让我写个方法来解决,一开始是让我删除,后来想了想让我先压缩再删除文件夹,下面提供两个版本的源代码及简单使用。

注:这两个代码也是博主CV的网上然后修改的,如侵权,请联系本人。(就算你联系了我也不会删,给你加个原文链接,啊嘻嘻嘻)

方法一:

在log4的config的配置文件中加上如下配置:

<logger name="ApplicationRollingFile">
      <level value="ALL"/>
      <appender-ref ref="InfoLog"/>
      <appender-ref ref="WarnLog"/>
      <appender-ref ref="TraceLog"/>
      <appender-ref ref="ErrorLog"/>
      <appender-ref ref="FatalLog"/>
 </logger>

日志划分删除代码:

 这里我加了个额外情况,就是生产环境中日志可能从别的地方烤过来,,,确实有这种情况。这个是自己设定多少天,然后传参传进函数,调用时会删除从今天开始算起,前面days的所有日志.但是删了万一日后要用,所以建议使用第二种方法,即先压缩,再删除原文件夹。

public class LogDivide
    {
        static ILog _log = null;
        static object lockHelper = new object();
        public static void GetLog(int days)
        {

            if (null == _log)
            {
                lock (lockHelper)
                {
                    if (null == _log)
                    {
                        StackTrace stackTrace = new StackTrace(0);
                        StackFrame stackFrame = stackTrace.GetFrame(0);
                        MethodBase methodBase = stackFrame.GetMethod();

                        // ApplicationRollingFile在.config文件中配置的名称
                        _log = LogManager.GetLogger("ApplicationRollingFile");
                        Task.Run(() => {
                            var apps = _log.Logger.Repository.GetAppenders();
                            if (apps.Length <= 0)
                            {
                                return;
                            }
                            var now = DateTime.UtcNow.AddDays(-1*days);
                            foreach (var item in apps)
                            {
                                if (item is RollingFileAppender)
                                {
                                    RollingFileAppender roll = item as RollingFileAppender;
                                    var dir = Path.GetDirectoryName(roll.File);
                                    var files = Directory.GetFiles(dir, "*.txt");
                                    //var sample = "log.txt2017-10-23.txt";

                                    foreach (var filePath in files)
                                    {
                                        var file = new FileInfo(filePath);

                                        // 20220809 jyj 为了防止更换电脑日志从其他地方拷过来,这里采用修改时间
                                        if (file.LastWriteTimeUtc < now)
                                        {
                                            try
                                            {
                                                file.Delete();
                                            }
                                            catch (Exception)
                                            {

                                            }
                                        }
                                    }
                                }
                            }
                        });
                    }
                }
            }

            //return _log;
        }
    }

方法二:

方法二呢

方法二呢就是上面说的先压缩,然后再删除原文件夹,这样做呢保守一点,推荐使用。

 

    public class LogZip
    {
        /// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="sourceFilePath"></param>
        /// <param name="destinationZipFilePath"></param>
        public static void CreateZip(string sourceFilePath, string destinationZipFilePath)
        {
            if (sourceFilePath[sourceFilePath.Length - 1] != Path.DirectorySeparatorChar)
            {
                sourceFilePath += Path.DirectorySeparatorChar;
            }

            ZipOutputStream zipStream = new ZipOutputStream(File.Create(destinationZipFilePath));
            zipStream.SetLevel(6);  // 压缩级别 0-9
            CreateZipFiles(sourceFilePath, zipStream, sourceFilePath);

            zipStream.Finish();
            zipStream.Close();
        }

        /// <summary>
        /// 递归压缩文件
        /// </summary>
        /// <param name="sourceFilePath">待压缩的文件或文件夹路径</param>
        /// <param name="zipStream">打包结果的zip文件路径(类似 D:\WorkSpace\a.zip),全路径包括文件名和.zip扩展名</param>
        /// <param name="staticFile"></param>
        private static void CreateZipFiles(string sourceFilePath, ZipOutputStream zipStream, string staticFile)
        {
            try
            {
                if (System.IO.File.Exists(sourceFilePath))
                {
                    Crc32 crc = new Crc32();
                    string[] filesArray = Directory.GetFileSystemEntries(sourceFilePath);
                    foreach (string file in filesArray)
                    {
                        if (Directory.Exists(file))                     //如果当前是文件夹,递归
                        {
                            CreateZipFiles(file, zipStream, staticFile);
                        }
                        else                                            //如果是文件,开始压缩
                        {
                            FileStream fileStream = File.OpenRead(file);

                            byte[] buffer = new byte[fileStream.Length];
                            fileStream.Read(buffer, 0, buffer.Length);
                            string tempFile = file.Substring(staticFile.LastIndexOf("\\") + 1);
                            ZipEntry entry = new ZipEntry(tempFile);

                            entry.DateTime = DateTime.Now;
                            entry.Size = fileStream.Length;
                            fileStream.Close();
                            crc.Reset();
                            crc.Update(buffer);
                            entry.Crc = crc.Value;
                            zipStream.PutNextEntry(entry);

                            zipStream.Write(buffer, 0, buffer.Length);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex.ToString());
            }
        }

        public static void DeleteFolder(string path)
        {
            try
            {
                if (System.IO.File.Exists(path))
                {
                    // 去除文件夹和子文件的只读属性
                    System.IO.DirectoryInfo fileInfo = new DirectoryInfo(path);
                    fileInfo.Attributes = FileAttributes.Normal & FileAttributes.Directory;
                    File.SetAttributes(path, FileAttributes.Normal);

                    // 判断文件夹是否还存在
                    if (Directory.Exists(path))
                    {
                        foreach (string f in Directory.GetFileSystemEntries(path))
                        {
                            if (File.Exists(f))
                            {
                                File.Delete(f);
                            }
                            else
                            {
                                DeleteFolder(f);
                            }
                        }
                    }

                    // 删除空文件夹
                    Directory.Delete(path);
                }

            }
            catch (Exception ex)
            {
                LogHelper.Error("日志压缩出现异常" + ex.ToString());
                throw ex;
            }
        }

    }

 

  

 

标签:Log4NET,string,zipStream,sourceFilePath,源码,File,new,日志,文件夹
来源: https://www.cnblogs.com/jyj666/p/16607262.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有