问题描述:
通过log4.config配置的时候在OCX(ActiveX IE插件模式 )安装时默认路径(C:\Program Files (x86))下权限不够没法创建和写入日志文件,CAB打包后也没有日志配置文件,为了解决这一问题,需要调整日志存储的路径,并将日志通过代码的方式来配置。
日志配置工具类:
using log4net; using log4net.Appender; using log4net.Core; using log4net.Filter; using log4net.Layout; using log4net.Repository.Hierarchy; using SQ.Base; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CvNetVideo.Logs { /// <summary> /// 日志设置类 /// </summary> public class LogSettings { RollingFileAppender appenderForInfo = new RollingFileAppender(); RollingFileAppender appenderForError = new RollingFileAppender(); private static LogSettings instance; private static object myLock = new object(); public static string GetLogPath() { return FileHelp.GetAppDataLocalLow() + "\\CvNetVideo\\Logs\\"; } public static string GetInfoPath(string path=null) { if (path==null) { return FileHelp.GetAppDataLocalLow() + "\\CvNetVideo\\Logs\\InfoLog\\"; } return FileHelp.GetAppDataLocalLow() + "\\CvNetVideo\\Logs\\InfoLog\\"+path; } public static string GetErrorPath(string path = null) { if (path == null) { return FileHelp.GetAppDataLocalLow() + "\\CvNetVideo\\Logs\\ErrorLog\\"; } return FileHelp.GetAppDataLocalLow() + "\\CvNetVideo\\Logs\\ErrorLog\\" + path; } /// <summary> /// 初始化配置 /// </summary> private LogSettings() { ConfigInfoLog(GetInfoPath()); ConfigErrorLog(GetErrorPath()); } /// <summary> /// 获取单例对象配置 /// </summary> /// <returns></returns> public static LogSettings getInstance() { lock (myLock) { if (instance == null) { instance = new LogSettings(); } return instance; } } /// <summary> /// 设置系统所用Log实例 /// </summary> /// <param name="logType"></param> public void SetLogger(LOGTYPE logType) { Log.Log4= LogManager.GetLogger(logType.ToString()); Console.WriteLine(Log.Log4); } /// <summary> /// 设置普通日志信息 /// </summary> private void ConfigInfoLog(string path) { //设置日志名称 appenderForInfo.Name = LOGTYPE.INFO.ToString(); //设置文件路径 appenderForInfo.File = path; //是否在文件中追加 appenderForInfo.AppendToFile = true; //按照文件的大小进行变换日志文件 //appenderForInfo.RollingStyle = RollingFileAppender.RollingMode.Size;// 保持一个文件,路径:appenderForInfo.File ="..../*.log" appenderForInfo.RollingStyle = RollingFileAppender.RollingMode.Composite; //最大变换数量 appenderForInfo.MaxSizeRollBackups = 100; //最大文件大小 appenderForInfo.MaximumFileSize = "10MB"; //日志文件名是否为静态 appenderForInfo.StaticLogFileName = false; //日期格式 appenderForInfo.DatePattern = "'INFO_'yyyy-MM-dd'.log'"; //设置输出日志格式 PatternLayout patternLayout = new PatternLayout(); patternLayout.ConversionPattern = "%d [%t] %-5p %c [%x] - %m%n"; //启用正则输出 patternLayout.ActivateOptions(); //模式布局 appenderForInfo.Layout = patternLayout; //添加日志等级过滤 LevelRangeFilter levelRangeFilter = new LevelRangeFilter(); //Level级别由低到高:ALL DEBUG INFO WARN ERROR FATAL None levelRangeFilter.LevelMax = Level.Info; levelRangeFilter.LevelMin = Level.All; appenderForInfo.AddFilter(levelRangeFilter); //启用当前配置 appenderForInfo.ActivateOptions(); //设置到配置 log4net.Config.BasicConfigurator.Configure(appenderForInfo); } /// <summary> /// 设置错误日志信息 /// </summary> private void ConfigErrorLog(string path) { //设置日志名称 appenderForError.Name = LOGTYPE.ERRORD.ToString(); //设置文件路径 appenderForError.File = path; //是否在文件中追加 appenderForError.AppendToFile = true; //按照文件的大小进行变换日志文件 appenderForError.RollingStyle = RollingFileAppender.RollingMode.Composite; //最大变换数量 appenderForError.MaxSizeRollBackups = 100; //最大文件大小 appenderForError.MaximumFileSize = "10MB"; //日志文件名是否为静态 appenderForError.StaticLogFileName = false; //日期格式 appenderForError.DatePattern ="'ERROR_'yyyy-MM-dd'.log'"; //设置输出日志格式 PatternLayout patternLayout = new PatternLayout(); patternLayout.ConversionPattern = "%d [%t] %-5p %c [%x] - %m%n"; //启用正则输出 patternLayout.ActivateOptions(); //模式布局 appenderForError.Layout = patternLayout; //添加日志等级过滤 LevelRangeFilter levelRangeFilter = new LevelRangeFilter(); // Level级别由低到高:ALL DEBUG INFO WARN ERROR FATAL None levelRangeFilter.LevelMax = Level.Fatal; levelRangeFilter.LevelMin = Level.Warn; appenderForError.AddFilter(levelRangeFilter); //启用当前配置 appenderForError.ActivateOptions(); //设置到配置 log4net.Config.BasicConfigurator.Configure(appenderForError); } } }
调用方式(DEBUG才允许调用):
#if DEBUG // 调试用代码 // 设置系统日志 LogSettings.getInstance().SetLogger(LOGTYPE.INFO); Log.WriteLog4("LogSettings.getInstance().SetLogger(LOGTYPE.INFO)" + DateTime.Now); #endif
打开文件路径:
private void tsmiLogManage_Click(object sender, EventArgs e) { Log.WriteLog4(DateTime.Now+"----------------------------------查看运行日志-----------------------------"); System.Diagnostics.Process.Start(@FileHelp.GetAppDataLocalLow() + "\\Logs"); }
效果如下图:
系统文件操作:
/// <summary> /// 用户路径 /// </summary> /// <returns></returns> public static string GetUserProfile() { return Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); }
/// <summary> /// IE保护模式下的低权限操作路径(%userprofile%/AppData/LocalLow) /// 参考:https://blog.csdn.net/xt_xiaotian/article/details/5336809 /// </summary> /// <returns></returns> public static string GetAppDataLocalLow() { return GetUserProfile() + "\\AppData\\LocalLow"; }
输出样式说明:
%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个字符则以空格填充。