关键词搜索

源码搜索 ×
×

C# Log4net日志代码配置解决OCX不写日志问题

发布2018-06-08浏览1055次

详情内容

问题描述:

通过log4.config配置的时候在OCX(ActiveX IE插件模式 )安装时默认路径(C:\Program Files (x86))权限不够没法创建和写入日志文件,CAB打包后也没有日志配置文件,为了解决这一问题,需要调整日志存储的路径,并将日志通过代码的方式来配置。

日志配置工具类:

  1. using log4net;
  2. using log4net.Appender;
  3. using log4net.Core;
  4. using log4net.Filter;
  5. using log4net.Layout;
  6. using log4net.Repository.Hierarchy;
  7. using SQ.Base;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. namespace CvNetVideo.Logs
  14. {
  15.     /// <summary>
  16.     /// 日志设置类
  17.     /// </summary>
  18.     public class LogSettings
  19.     {
  20.         RollingFileAppender appenderForInfo = new RollingFileAppender();
  21.         RollingFileAppender appenderForError = new RollingFileAppender();
  22.         private static LogSettings instance;
  23.         private static object myLock = new object();
  24.         public static string GetLogPath()
  25.         {
  26.             return FileHelp.GetAppDataLocalLow() + "\\CvNetVideo\\Logs\\";
  27.         }
  28.         public static string GetInfoPath(string path=null)
  29.         {
  30.             if (path==null)
  31.             {
  32.                 return FileHelp.GetAppDataLocalLow() + "\\CvNetVideo\\Logs\\InfoLog\\";
  33.             }
  34.             return FileHelp.GetAppDataLocalLow() + "\\CvNetVideo\\Logs\\InfoLog\\"+path;
  35.         }
  36.         public static string GetErrorPath(string path = null)
  37.         {
  38.             if (path == null)
  39.             {
  40.                 return FileHelp.GetAppDataLocalLow() + "\\CvNetVideo\\Logs\\ErrorLog\\";
  41.             }
  42.             return FileHelp.GetAppDataLocalLow() + "\\CvNetVideo\\Logs\\ErrorLog\\" + path;
  43.         }
  44.         /// <summary>
  45.         /// 初始化配置
  46.         /// </summary>
  47.         private LogSettings()
  48.         {
  49.             ConfigInfoLog(GetInfoPath());
  50.             ConfigErrorLog(GetErrorPath());
  51.         }
  52.         /// <summary>
  53.         /// 获取单例对象配置
  54.         /// </summary>
  55.         /// <returns></returns>
  56.         public static LogSettings getInstance()
  57.         {
  58.             lock (myLock)
  59.             {
  60.                 if (instance == null)
  61.                 {
  62.                     instance = new LogSettings();
  63.                 }
  64.                 return instance;
  65.             }
  66.         }
  67.         /// <summary>
  68.         /// 设置系统所用Log实例
  69.         /// </summary>
  70.         /// <param name="logType"></param>
  71.         public void SetLogger(LOGTYPE logType)
  72.         {
  73.             Log.Log4= LogManager.GetLogger(logType.ToString());
  74.             Console.WriteLine(Log.Log4);
  75.         }
  76.         /// <summary>
  77.         /// 设置普通日志信息
  78.         /// </summary>
  79.         private void ConfigInfoLog(string path)
  80.         {
  81.             //设置日志名称
  82.             appenderForInfo.Name = LOGTYPE.INFO.ToString();
  83.             //设置文件路径
  84.             appenderForInfo.File = path;
  85.             //是否在文件中追加
  86.             appenderForInfo.AppendToFile = true;
  87.             //按照文件的大小进行变换日志文件
  88.             //appenderForInfo.RollingStyle = RollingFileAppender.RollingMode.Size;// 保持一个文件,路径:appenderForInfo.File ="..../*.log"
  89.             appenderForInfo.RollingStyle = RollingFileAppender.RollingMode.Composite;
  90.             //最大变换数量
  91.             appenderForInfo.MaxSizeRollBackups = 100;
  92.             //最大文件大小
  93.             appenderForInfo.MaximumFileSize = "10MB";
  94.             //日志文件名是否为静态
  95.             appenderForInfo.StaticLogFileName = false;
  96.             //日期格式
  97.             appenderForInfo.DatePattern = "'INFO_'yyyy-MM-dd'.log'";
  98.             //设置输出日志格式
  99.             PatternLayout patternLayout = new PatternLayout();
  100.             patternLayout.ConversionPattern = "%d [%t] %-5p %c [%x]  - %m%n";
  101.             //启用正则输出
  102.             patternLayout.ActivateOptions();
  103.             //模式布局
  104.             appenderForInfo.Layout = patternLayout;
  105.             //添加日志等级过滤
  106.             LevelRangeFilter levelRangeFilter = new LevelRangeFilter();
  107.             //Level级别由低到高:ALL DEBUG INFO WARN ERROR FATAL None
  108.             levelRangeFilter.LevelMax = Level.Info;
  109.             levelRangeFilter.LevelMin = Level.All;
  110.             appenderForInfo.AddFilter(levelRangeFilter);
  111.             //启用当前配置
  112.             appenderForInfo.ActivateOptions();
  113.             //设置到配置
  114.             log4net.Config.BasicConfigurator.Configure(appenderForInfo);
  115.         }
  116.         /// <summary>
  117.         /// 设置错误日志信息
  118.         /// </summary>
  119.         private void ConfigErrorLog(string path)
  120.         {
  121.             //设置日志名称
  122.             appenderForError.Name = LOGTYPE.ERRORD.ToString();
  123.             //设置文件路径
  124.             appenderForError.File = path;
  125.             //是否在文件中追加
  126.             appenderForError.AppendToFile = true;
  127.             //按照文件的大小进行变换日志文件
  128.             appenderForError.RollingStyle = RollingFileAppender.RollingMode.Composite;
  129.             //最大变换数量
  130.             appenderForError.MaxSizeRollBackups = 100;
  131.             //最大文件大小
  132.             appenderForError.MaximumFileSize = "10MB";
  133.             //日志文件名是否为静态
  134.             appenderForError.StaticLogFileName = false;
  135.             //日期格式
  136.             appenderForError.DatePattern ="'ERROR_'yyyy-MM-dd'.log'";
  137.             //设置输出日志格式
  138.             PatternLayout patternLayout = new PatternLayout();
  139.             patternLayout.ConversionPattern = "%d [%t] %-5p %c [%x]  - %m%n";
  140.             //启用正则输出
  141.             patternLayout.ActivateOptions();
  142.             //模式布局
  143.             appenderForError.Layout = patternLayout;
  144.             //添加日志等级过滤
  145.             LevelRangeFilter levelRangeFilter = new LevelRangeFilter();
  146.             // Level级别由低到高:ALL DEBUG INFO WARN ERROR FATAL None
  147.             levelRangeFilter.LevelMax = Level.Fatal;
  148.             levelRangeFilter.LevelMin = Level.Warn;
  149.             appenderForError.AddFilter(levelRangeFilter);
  150.             //启用当前配置
  151.             appenderForError.ActivateOptions();
  152.             //设置到配置
  153.             log4net.Config.BasicConfigurator.Configure(appenderForError);
  154.         }
  155.     }
  156. }

调用方式(DEBUG才允许调用):

  1. #if DEBUG
  2. // 调试用代码
  3. // 设置系统日志
  4. LogSettings.getInstance().SetLogger(LOGTYPE.INFO);
  5. Log.WriteLog4("LogSettings.getInstance().SetLogger(LOGTYPE.INFO)" + DateTime.Now);
  6. #endif

打开文件路径:

  1. private void tsmiLogManage_Click(object sender, EventArgs e)
  2. {
  3. Log.WriteLog4(DateTime.Now+"----------------------------------查看运行日志-----------------------------");
  4. System.Diagnostics.Process.Start(@FileHelp.GetAppDataLocalLow() + "\\Logs");
  5. }

效果如下图:

系统文件操作:

  1. /// <summary>
  2. /// 用户路径
  3. /// </summary>
  4. /// <returns></returns>
  5. public static string GetUserProfile()
  6. {
  7. return Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
  8. }
  1. /// <summary>
  2. /// IE保护模式下的低权限操作路径(%userprofile%/AppData/LocalLow)
  3. /// 参考:https://blog.csdn.net/xt_xiaotian/article/details/5336809
  4. /// </summary>
  5. /// <returns></returns>
  6. public static string GetAppDataLocalLow()
  7. {
  8. return GetUserProfile() + "\\AppData\\LocalLow";
  9. }

输出样式说明:

%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
%n(new line):换行
%d(datetime):输出当前语句运行的时刻
%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id):当前语句所在的线程ID
%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
%c(class):当前日志对象的名称,例如:
%f(file):输出语句所在的文件名。
%l(line):输出语句所在的行号。
%数字:表示该项的最小长度,如果不够,则用空格填充,如“%-5level”表示level的最小宽度是5个字符,如果实际长度不够5个字符则以空格填充。


相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载