Ported .Net Core commits:
hondacrx: - Initial commit: Switch to .Net Core 2.0 - Fix build and removed not needed files Fabi: - Updated solution platforms. - Changed folder structure. - Change library target framework to netstandard2.0. - Updated solution platforms again... - Removed windows specific kernel32 function usage (Ctrl-C handler).
This commit is contained in:
@@ -0,0 +1,238 @@
|
||||
/*
|
||||
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using Framework.Database;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
class ConsoleAppender : Appender
|
||||
{
|
||||
public ConsoleAppender(byte id, string name, LogLevel level, AppenderFlags flags) : base(id, name, level, flags)
|
||||
{
|
||||
_consoleColor = new[]
|
||||
{
|
||||
ConsoleColor.White,
|
||||
ConsoleColor.White,
|
||||
ConsoleColor.Gray,
|
||||
ConsoleColor.Green,
|
||||
ConsoleColor.Yellow,
|
||||
ConsoleColor.Red,
|
||||
ConsoleColor.Blue
|
||||
};
|
||||
}
|
||||
|
||||
public override void _write(LogMessage message)
|
||||
{
|
||||
Console.ForegroundColor = _consoleColor[(int)message.level];
|
||||
Console.WriteLine(message.prefix + message.text);
|
||||
Console.ResetColor();
|
||||
}
|
||||
|
||||
public override AppenderType GetAppenderType()
|
||||
{
|
||||
return AppenderType.Console;
|
||||
}
|
||||
|
||||
ConsoleColor[] _consoleColor;
|
||||
}
|
||||
|
||||
class FileAppender : Appender, IDisposable
|
||||
{
|
||||
public FileAppender(byte id, string name, LogLevel level, string fileName, string logDir, AppenderFlags flags) : base(id, name, level, flags)
|
||||
{
|
||||
Directory.CreateDirectory(logDir);
|
||||
_fileName = fileName;
|
||||
_logDir = logDir;
|
||||
_dynamicName = _fileName.Contains("{0}");
|
||||
|
||||
if (_dynamicName)
|
||||
{
|
||||
Directory.CreateDirectory(logDir + "/" + _fileName.Substring(0, _fileName.IndexOf('/') + 1));
|
||||
return;
|
||||
}
|
||||
|
||||
_logStream = OpenFile(_fileName, FileMode.Create);
|
||||
}
|
||||
|
||||
FileStream OpenFile(string filename, FileMode mode)
|
||||
{
|
||||
return new FileStream(_logDir + "/" + filename, mode, FileAccess.Write, FileShare.ReadWrite);
|
||||
}
|
||||
|
||||
public override void _write(LogMessage message)
|
||||
{
|
||||
lock (locker)
|
||||
{
|
||||
var logBytes = Encoding.Unicode.GetBytes(message.prefix + message.text + "\r\n");
|
||||
|
||||
if (_dynamicName)
|
||||
{
|
||||
var logStream = OpenFile(string.Format(_fileName, message.dynamicName), FileMode.Append);
|
||||
logStream.Write(logBytes, 0, logBytes.Length);
|
||||
logStream.Flush();
|
||||
logStream.Close();
|
||||
return;
|
||||
}
|
||||
|
||||
_logStream.Write(logBytes, 0, logBytes.Length);
|
||||
_logStream.Flush();
|
||||
}
|
||||
}
|
||||
|
||||
public override AppenderType GetAppenderType()
|
||||
{
|
||||
return AppenderType.File;
|
||||
}
|
||||
|
||||
#region IDisposable Support
|
||||
private bool disposedValue = false;
|
||||
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (!disposedValue)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
_logStream.Dispose();
|
||||
}
|
||||
|
||||
disposedValue = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
}
|
||||
#endregion
|
||||
|
||||
string _fileName;
|
||||
string _logDir;
|
||||
bool _dynamicName;
|
||||
FileStream _logStream;
|
||||
object locker = new object();
|
||||
}
|
||||
|
||||
class DBAppender : Appender
|
||||
{
|
||||
public DBAppender(byte id, string name, LogLevel level) : base(id, name, level) { }
|
||||
|
||||
public override void _write(LogMessage message)
|
||||
{
|
||||
// Avoid infinite loop, PExecute triggers Logging with "sql.sql" type
|
||||
if (!enabled || message.type == LogFilter.Sql)
|
||||
return;
|
||||
|
||||
PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.INS_LOG);
|
||||
stmt.AddValue(0, Time.DateTimeToUnixTime(message.mtime));
|
||||
stmt.AddValue(1, realmId);
|
||||
stmt.AddValue(2, message.type);
|
||||
stmt.AddValue(3, (byte)message.level);
|
||||
stmt.AddValue(4, message.text);
|
||||
DB.Login.Execute(stmt);
|
||||
}
|
||||
|
||||
public override AppenderType GetAppenderType()
|
||||
{
|
||||
return AppenderType.DB;
|
||||
}
|
||||
|
||||
public override void setRealmId(uint _realmId)
|
||||
{
|
||||
enabled = true;
|
||||
realmId = _realmId;
|
||||
}
|
||||
|
||||
uint realmId;
|
||||
bool enabled;
|
||||
}
|
||||
|
||||
abstract class Appender
|
||||
{
|
||||
public Appender(byte id, string name, LogLevel level = LogLevel.Disabled, AppenderFlags flags = AppenderFlags.None)
|
||||
{
|
||||
_id = id;
|
||||
_name = name;
|
||||
_level = level;
|
||||
_flags = flags;
|
||||
}
|
||||
|
||||
public void Write(LogMessage message)
|
||||
{
|
||||
if (_level == LogLevel.Disabled || _level > message.level)
|
||||
return;
|
||||
|
||||
StringBuilder ss = new StringBuilder();
|
||||
|
||||
if (_flags.HasAnyFlag(AppenderFlags.PrefixTimestamp))
|
||||
ss.AppendFormat("{0} ", message.mtime.ToString("MM/dd/yyyy HH:mm:ss"));
|
||||
|
||||
if (_flags.HasAnyFlag(AppenderFlags.PrefixLogLevel))
|
||||
ss.AppendFormat("{0}: ", message.level);
|
||||
|
||||
if (_flags.HasAnyFlag(AppenderFlags.PrefixLogFilterType))
|
||||
ss.AppendFormat("[{0}] ", message.type);
|
||||
|
||||
message.prefix = ss.ToString();
|
||||
_write(message);
|
||||
}
|
||||
|
||||
public abstract void _write(LogMessage message);
|
||||
|
||||
public byte getId()
|
||||
{
|
||||
return _id;
|
||||
}
|
||||
|
||||
public string getName()
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
|
||||
public abstract AppenderType GetAppenderType();
|
||||
|
||||
public virtual void setRealmId(uint realmId) { }
|
||||
|
||||
public void setLogLevel(LogLevel level)
|
||||
{
|
||||
_level = level;
|
||||
}
|
||||
|
||||
byte _id;
|
||||
string _name;
|
||||
LogLevel _level;
|
||||
AppenderFlags _flags;
|
||||
}
|
||||
|
||||
class LogMessage
|
||||
{
|
||||
public LogMessage(LogLevel _level, LogFilter _type, string _text)
|
||||
{
|
||||
level = _level;
|
||||
type = _type;
|
||||
text = _text;
|
||||
mtime = DateTime.Now;
|
||||
}
|
||||
|
||||
public LogLevel level;
|
||||
public LogFilter type;
|
||||
public string text;
|
||||
public string prefix;
|
||||
public string dynamicName;
|
||||
public DateTime mtime;
|
||||
}
|
||||
@@ -0,0 +1,436 @@
|
||||
/*
|
||||
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using Framework.Collections;
|
||||
using Framework.Configuration;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
public class Log
|
||||
{
|
||||
static Log()
|
||||
{
|
||||
m_logsDir = ConfigMgr.GetDefaultValue("LogsDir", "");
|
||||
|
||||
foreach (var appenderName in ConfigMgr.GetKeysByString("Appender."))
|
||||
{
|
||||
CreateAppenderFromConfig(appenderName);
|
||||
}
|
||||
|
||||
foreach (var loggerName in ConfigMgr.GetKeysByString("Logger."))
|
||||
{
|
||||
CreateLoggerFromConfig(loggerName);
|
||||
}
|
||||
|
||||
// Bad config configuration, creating default config
|
||||
if (!loggers.ContainsKey(LogFilter.Server))
|
||||
{
|
||||
Console.WriteLine("Wrong Loggers configuration. Review your Logger config section.\nCreating default loggers [Server (Info)] to console\n");
|
||||
|
||||
loggers.Clear();
|
||||
appenders.Clear();
|
||||
|
||||
byte id = NextAppenderId();
|
||||
|
||||
var appender = new ConsoleAppender(id, "Console", LogLevel.Debug, AppenderFlags.None);
|
||||
appenders[id] = appender;
|
||||
|
||||
var serverLogger = new Logger("Server", LogLevel.Error);
|
||||
serverLogger.addAppender(id, appender);
|
||||
loggers[LogFilter.Server] = serverLogger;
|
||||
}
|
||||
|
||||
outInfo(LogFilter.Server, @" ____ __ ");
|
||||
outInfo(LogFilter.Server, @"/\ _`\ /\ \ ");
|
||||
outInfo(LogFilter.Server, @"\ \ \/\_\ __ __ _____\ \ \___ __ _ __ ");
|
||||
outInfo(LogFilter.Server, @" \ \ \/_/_/\ \/\ \/\ '__`\ \ _ `\ /'__`\/\`'__\");
|
||||
outInfo(LogFilter.Server, @" \ \ \L\ \ \ \_\ \ \ \L\ \ \ \ \ \/\ __/\ \ \/ ");
|
||||
outInfo(LogFilter.Server, @" \ \____/\/`____ \ \ ,__/\ \_\ \_\ \____\\ \_\ ");
|
||||
outInfo(LogFilter.Server, @" \/___/ `/___/> \ \ \/ \/_/\/_/\/____/ \/_/ ");
|
||||
outInfo(LogFilter.Server, @" /\___/\ \_\ ");
|
||||
outInfo(LogFilter.Server, @" \/__/ \/_/ Core");
|
||||
outInfo(LogFilter.Server, "\r");
|
||||
}
|
||||
|
||||
static bool ShouldLog(LogFilter type, LogLevel level)
|
||||
{
|
||||
Logger logger = GetLoggerByType(type);
|
||||
if (logger == null)
|
||||
return false;
|
||||
|
||||
LogLevel logLevel = logger.getLogLevel();
|
||||
return logLevel != LogLevel.Disabled && logLevel <= level;
|
||||
}
|
||||
|
||||
public static void outInfo(LogFilter type, string text, params object[] args)
|
||||
{
|
||||
if (!ShouldLog(type, LogLevel.Info))
|
||||
return;
|
||||
|
||||
outMessage(type, LogLevel.Info, text, args);
|
||||
}
|
||||
|
||||
public static void outWarn(LogFilter type, string text, params object[] args)
|
||||
{
|
||||
if (!ShouldLog(type, LogLevel.Warn))
|
||||
return;
|
||||
|
||||
outMessage(type, LogLevel.Warn, text, args);
|
||||
}
|
||||
|
||||
[Conditional("DEBUG")]
|
||||
public static void outDebug(LogFilter type, string text, params object[] args)
|
||||
{
|
||||
if (!ShouldLog(type, LogLevel.Debug))
|
||||
return;
|
||||
|
||||
outMessage(type, LogLevel.Debug, text, args);
|
||||
}
|
||||
|
||||
public static void outError(LogFilter type, string text, params object[] args)
|
||||
{
|
||||
if (!ShouldLog(type, LogLevel.Error))
|
||||
return;
|
||||
|
||||
outMessage(type, LogLevel.Error, text, args);
|
||||
}
|
||||
|
||||
public static void outException(Exception ex, [CallerMemberName]string memberName = "")
|
||||
{
|
||||
if (!ShouldLog(LogFilter.Server, LogLevel.Fatal))
|
||||
return;
|
||||
|
||||
outMessage(LogFilter.Server, LogLevel.Fatal, "MemberName: {0} ExceptionMessage: {1}", memberName, ex.Message);
|
||||
}
|
||||
|
||||
public static void outFatal(LogFilter type, string text, params object[] args)
|
||||
{
|
||||
if (!ShouldLog(type, LogLevel.Fatal))
|
||||
return;
|
||||
|
||||
outMessage(type, LogLevel.Fatal, text, args);
|
||||
}
|
||||
|
||||
public static void outTrace(LogFilter type, string text, params object[] args)
|
||||
{
|
||||
if (!ShouldLog(type, LogLevel.Trace))
|
||||
return;
|
||||
|
||||
outMessage(type, LogLevel.Trace, text, args);
|
||||
}
|
||||
|
||||
public static void outCommand(uint accountId, string text, params object[] args)
|
||||
{
|
||||
if (!ShouldLog(LogFilter.Commands, LogLevel.Info))
|
||||
return;
|
||||
|
||||
var msg = new LogMessage(LogLevel.Info, LogFilter.Commands, string.Format(text, args));
|
||||
msg.dynamicName = accountId.ToString();
|
||||
|
||||
Logger logger = GetLoggerByType(LogFilter.Commands);
|
||||
logger.write(msg);
|
||||
}
|
||||
|
||||
static void outMessage(LogFilter type, LogLevel level, string text, params object[] args)
|
||||
{
|
||||
Logger logger = GetLoggerByType(type);
|
||||
logger.write(new LogMessage(level, type, string.Format(text, args)));
|
||||
}
|
||||
|
||||
static byte NextAppenderId()
|
||||
{
|
||||
return AppenderId++;
|
||||
}
|
||||
|
||||
static void CreateAppenderFromConfig(string appenderName)
|
||||
{
|
||||
if (string.IsNullOrEmpty(appenderName))
|
||||
return;
|
||||
|
||||
string options = ConfigMgr.GetDefaultValue(appenderName, "");
|
||||
var tokens = new StringArray(options, ',');
|
||||
string name = appenderName.Substring(9);
|
||||
|
||||
if (tokens.Length < 2)
|
||||
{
|
||||
Console.WriteLine("Log.CreateAppenderFromConfig: Wrong configuration for appender {0}. Config line: {1}", name, options);
|
||||
return;
|
||||
}
|
||||
|
||||
AppenderFlags flags = AppenderFlags.None;
|
||||
AppenderType type = (AppenderType)uint.Parse(tokens[0]);
|
||||
LogLevel level = (LogLevel)uint.Parse(tokens[1]);
|
||||
|
||||
if (level > LogLevel.Fatal)
|
||||
{
|
||||
Console.WriteLine("Log.CreateAppenderFromConfig: Wrong Log Level {0} for appender {1}\n", level, name);
|
||||
return;
|
||||
}
|
||||
|
||||
if (tokens.Length > 2)
|
||||
flags = (AppenderFlags)uint.Parse(tokens[2]);
|
||||
|
||||
byte id = NextAppenderId();
|
||||
switch (type)
|
||||
{
|
||||
case AppenderType.Console:
|
||||
{
|
||||
var appender = new ConsoleAppender(id, name, level, flags);
|
||||
appenders[id] = appender;
|
||||
break;
|
||||
}
|
||||
case AppenderType.File:
|
||||
{
|
||||
string filename = "";
|
||||
if (tokens.Length < 4)
|
||||
{
|
||||
if (name != "Server")
|
||||
{
|
||||
Console.WriteLine("Log.CreateAppenderFromConfig: Missing file name for appender {0}", name);
|
||||
return;
|
||||
}
|
||||
|
||||
filename = Process.GetCurrentProcess().ProcessName + ".log";
|
||||
}
|
||||
else
|
||||
filename = tokens[3];
|
||||
|
||||
appenders[id] = new FileAppender(id, name, level, filename, m_logsDir, flags);
|
||||
break;
|
||||
}
|
||||
case AppenderType.DB:
|
||||
{
|
||||
appenders[id] = new DBAppender(id, name, level);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
Console.WriteLine("Log.CreateAppenderFromConfig: Unknown type {0} for appender {1}", type, name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void CreateLoggerFromConfig(string appenderName)
|
||||
{
|
||||
if (string.IsNullOrEmpty(appenderName))
|
||||
return;
|
||||
|
||||
LogLevel level = LogLevel.Disabled;
|
||||
string name = appenderName.Substring(7);
|
||||
|
||||
string options = ConfigMgr.GetDefaultValue(appenderName, "");
|
||||
if (string.IsNullOrEmpty(options))
|
||||
{
|
||||
Console.WriteLine("Log.CreateLoggerFromConfig: Missing config option Logger.{0}", name);
|
||||
return;
|
||||
}
|
||||
var tokens = new StringArray(options, ',');
|
||||
|
||||
LogFilter type = name.ToEnum<LogFilter>();
|
||||
if (loggers.ContainsKey(type))
|
||||
{
|
||||
Console.WriteLine("Error while configuring Logger {0}. Already defined", name);
|
||||
return;
|
||||
}
|
||||
|
||||
level = (LogLevel)uint.Parse(tokens[0]);
|
||||
if (level > LogLevel.Fatal)
|
||||
{
|
||||
Console.WriteLine("Log.CreateLoggerFromConfig: Wrong Log Level {0} for logger {1}", type, name);
|
||||
return;
|
||||
}
|
||||
|
||||
Logger logger = new Logger(name, level);
|
||||
|
||||
int i = 0;
|
||||
var ss = new StringArray(tokens[1], ' ');
|
||||
while (i < ss.Length)
|
||||
{
|
||||
var str = ss[i++];
|
||||
Appender appender = GetAppenderByName(str);
|
||||
if (appender == null)
|
||||
Console.WriteLine("Error while configuring Appender {0} in Logger {1}. Appender does not exist", str, name);
|
||||
else
|
||||
logger.addAppender(appender.getId(), appender);
|
||||
}
|
||||
|
||||
loggers[type] = logger;
|
||||
}
|
||||
|
||||
static Appender GetAppenderByName(string name)
|
||||
{
|
||||
return appenders.First(p => p.Value.getName() == name).Value;
|
||||
}
|
||||
|
||||
static Logger GetLoggerByType(LogFilter type)
|
||||
{
|
||||
if (loggers.ContainsKey(type))
|
||||
return loggers[type];
|
||||
|
||||
string typeString = type.ToString();
|
||||
|
||||
int index = 1;
|
||||
for (; index < typeString.Length - 1; ++index)
|
||||
{
|
||||
if (char.IsUpper(typeString[index]))
|
||||
break;
|
||||
}
|
||||
|
||||
typeString = typeString.Substring(0, index);
|
||||
if (typeString.IsEmpty())
|
||||
return null;
|
||||
|
||||
LogFilter parentLogger;
|
||||
if (!Enum.TryParse(typeString, out parentLogger))
|
||||
return null;
|
||||
|
||||
return GetLoggerByType(parentLogger);
|
||||
}
|
||||
|
||||
public static bool SetLogLevel(string name, string newLevelc, bool isLogger = true)
|
||||
{
|
||||
LogLevel newLevel = (LogLevel)uint.Parse(newLevelc);
|
||||
if (newLevel < 0)
|
||||
return false;
|
||||
|
||||
if (isLogger)
|
||||
{
|
||||
foreach (var logger in loggers.Values)
|
||||
{
|
||||
if (logger.getName() == name)
|
||||
{
|
||||
logger.setLogLevel(newLevel);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Appender appender = GetAppenderByName(name);
|
||||
if (appender == null)
|
||||
return false;
|
||||
|
||||
appender.setLogLevel(newLevel);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void SetRealmId(uint id)
|
||||
{
|
||||
foreach (var appender in appenders.Values)
|
||||
appender.setRealmId(id);
|
||||
}
|
||||
|
||||
static string GetLogsDir() { return m_logsDir; }
|
||||
|
||||
static Dictionary<byte, Appender> appenders = new Dictionary<byte, Appender>();
|
||||
static Dictionary<LogFilter, Logger> loggers = new Dictionary<LogFilter, Logger>();
|
||||
static string m_logsDir;
|
||||
static byte AppenderId;
|
||||
}
|
||||
|
||||
enum AppenderType
|
||||
{
|
||||
None,
|
||||
Console,
|
||||
File,
|
||||
DB
|
||||
}
|
||||
|
||||
[Flags]
|
||||
enum AppenderFlags
|
||||
{
|
||||
None = 0x00,
|
||||
PrefixTimestamp = 0x01,
|
||||
PrefixLogLevel = 0x02,
|
||||
PrefixLogFilterType = 0x04,
|
||||
}
|
||||
|
||||
enum LogLevel
|
||||
{
|
||||
Disabled = 0,
|
||||
Trace = 1,
|
||||
Debug = 2,
|
||||
Info = 3,
|
||||
Warn = 4,
|
||||
Error = 5,
|
||||
Fatal = 6,
|
||||
Max = 6
|
||||
}
|
||||
|
||||
public enum LogFilter
|
||||
{
|
||||
Misc,
|
||||
Achievement,
|
||||
Addon,
|
||||
Ahbot,
|
||||
AreaTrigger,
|
||||
Arena,
|
||||
Auctionhouse,
|
||||
Battlefield,
|
||||
Battleground,
|
||||
BattlegroundReportPvpAfk,
|
||||
Calendar,
|
||||
ChatLog,
|
||||
ChatSystem,
|
||||
Cheat,
|
||||
Commands,
|
||||
Condition,
|
||||
Garrison,
|
||||
Gameevent,
|
||||
Guild,
|
||||
Lfg,
|
||||
Loot,
|
||||
MapsScript,
|
||||
Maps,
|
||||
Movement,
|
||||
Network,
|
||||
Outdoorpvp,
|
||||
Pet,
|
||||
Player,
|
||||
PlayerCharacter,
|
||||
PlayerDump,
|
||||
PlayerItems,
|
||||
PlayerLoading,
|
||||
PlayerSkills,
|
||||
Pool,
|
||||
Rbac,
|
||||
Realmlist,
|
||||
Scenario,
|
||||
Scenes,
|
||||
Scripts,
|
||||
ScriptsAi,
|
||||
Server,
|
||||
ServerLoading,
|
||||
ServiceProtobuf,
|
||||
Session,
|
||||
SessionRpc,
|
||||
Spells,
|
||||
SpellsPeriodic,
|
||||
Sql,
|
||||
SqlDev,
|
||||
SqlDriver,
|
||||
SqlUpdates,
|
||||
Transport,
|
||||
Unit,
|
||||
Vehicle,
|
||||
Warden,
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System.Collections.Generic;
|
||||
|
||||
class Logger
|
||||
{
|
||||
public Logger(string _name, LogLevel _level)
|
||||
{
|
||||
name = _name;
|
||||
level = _level;
|
||||
}
|
||||
|
||||
public void addAppender(byte id, Appender appender)
|
||||
{
|
||||
appenders[id] = appender;
|
||||
}
|
||||
|
||||
public void delAppender(byte id)
|
||||
{
|
||||
appenders.Remove(id);
|
||||
}
|
||||
|
||||
public void setLogLevel(LogLevel _level)
|
||||
{
|
||||
level = _level;
|
||||
}
|
||||
|
||||
public string getName()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
public LogLevel getLogLevel()
|
||||
{
|
||||
return level;
|
||||
}
|
||||
|
||||
public void write(LogMessage message)
|
||||
{
|
||||
if (level == 0 || level > message.level || string.IsNullOrEmpty(message.text))
|
||||
return;
|
||||
|
||||
foreach (var appender in appenders.Values)
|
||||
appender.Write(message);
|
||||
}
|
||||
|
||||
string name;
|
||||
LogLevel level;
|
||||
Dictionary<byte, Appender> appenders = new Dictionary<byte, Appender>();
|
||||
}
|
||||
Reference in New Issue
Block a user