using CommonLang.Log; using log4net; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; namespace Pomelo { public class LogConfig { /// /// 服务器id /// public string serverId; /// /// 日志配置文件 /// public string configFile; /// /// 日志输出目录 /// public string outputPath; /// /// 日志输出等级 /// public uint level; } public class PomeloLog : LoggerFactory { private uint logLevel; public PomeloLog(LogConfig config) { this.logLevel = config.level; if (this.logLevel == 0) { this.logLevel = 0xFF; } Console.WriteLine("C# log level:" + LogLevels(this.logLevel) + ",configFile:" + config.configFile); log4net.Config.XmlConfigurator.Configure(new FileInfo(config.configFile)); //foreach (log4net.Appender.IAppender appender in log4net.LogManager.GetRepository().GetAppenders()) //{ // var targetApder = appender as log4net.Appender.RollingFileAppender; // if (targetApder != null) // { // var currentDir = System.AppDomain.CurrentDomain.BaseDirectory; // string newFile = targetApder.File.Replace(currentDir, ""); // targetApder.File = config.outputPath + "/" + config.serverId + "/" + newFile; // +"-" + config.serverId + ".log"; // targetApder.File = config.outputPath + "/" + newFile + "-" + config.serverId + ".log"; // targetApder.ActivateOptions(); // } //} //log4net.GlobalContext.Properties["ServerId"] = config.serverId; } private string AddLevel(uint levelMask, uint level, string name) { if ((level & levelMask) == levelMask) { return name + " "; } return ""; } private string LogLevels(uint level) { string ret = "["; //ret += AddLevel(LoggerLevel.FINE, level, "FINE"); //ret += AddLevel(LoggerLevel.TRACE, level, "TRACE"); ret += AddLevel(LoggerLevel.DEBUG, level, "DEBUG"); //ret += AddLevel(LoggerLevel.LOG, level, "LOG"); ret += AddLevel(LoggerLevel.INFO, level, "INFO"); ret += AddLevel(LoggerLevel.WARNNING, level, "WARN"); ret += AddLevel(LoggerLevel.ERROR, level, "ERROR"); //ret += AddLevel(LoggerLevel.FATAL, level, "FATAL"); return ret + "]"; } protected override Logger CreateLogger(string name) { Log4netLogger log = new Log4netLogger(log4net.LogManager.GetLogger(name)); log.SetLevel(logLevel); return log; } } public class Log4netLogger : Logger { private log4net.ILog logger; public Log4netLogger(log4net.ILog logger) { this.logger = logger; } static readonly Dictionary logColor = new Dictionary() { { LoggerLevel.DEBUG , ConsoleColor.Green}, { LoggerLevel.INFO , ConsoleColor.White}, { LoggerLevel.WARNNING , ConsoleColor.Yellow}, { LoggerLevel.ERROR , ConsoleColor.Red} }; public void print2Console(uint level, string msg, Exception err = null) { ConsoleColor cc; if (logColor.TryGetValue(level, out cc)) { Console.ForegroundColor = cc; } else { Console.ForegroundColor = ConsoleColor.White; } Console.WriteLine(msg); if (err != null) { Console.WriteLine(err.StackTrace); } Console.ForegroundColor = ConsoleColor.White; } public override void LogLevel(uint level, string msg, Exception err = null) { //print2Console(level, msg, err); switch (level) { //case LoggerLevel.TRACE: // logger.Debug(msg, err); // break; case LoggerLevel.DEBUG: logger.Debug(msg, err); break; case LoggerLevel.INFO: logger.Info(msg, err); break; //case LoggerLevel.LOG: // logger.Info(msg, err); // break; //case LoggerLevel.FINE: // logger.Info(msg, err); // break; case LoggerLevel.WARNNING: print2Console(level, msg, err); logger.Warn(msg, err); break; case LoggerLevel.ERROR: print2Console(level, msg, err); logger.Error(msg, err); break; //case LoggerLevel.FATAL: // logger.Fatal(msg, err); // break; default: print2Console(level, msg, err); logger.Error(msg, err); break; } } protected override void LogLevelInternal(uint level, object msg, object[] args, Exception exception) { if (IsLevelEnable(level)) { //监控日志转成json格式 if ("monitor".Equals(this.logger.Logger.Name)) { //dynamic data = msg; //data.@version = "1"; //data.@timestamp = DateTime.Now.ToString("o"); //data.fields = new //{ // level = "INFO", // category = this.logger.Logger.Name, // serverType = "csharp", // serverId = log4net.GlobalContext.Properties["ServerId"] //}; string json = JsonConvert.SerializeObject(msg); //json转换没有@了,只能再加进去,后续想个高效一点的方式 //json = json.Replace("timestamp", "@timestamp"); //json = json.Replace("version", "@version"); msg = json; } base.LogLevelInternal(level, msg, args, exception); } } } }