Как правильно организовать Log в приложении? - C#
Формулировка задачи:
Здравствуйте.
Я хочу организовать в своем проекте логирование. Для этого набросал класс-логер.
ILogger.cs
Logger.cs
LogLevel.cs
Пример применения
Program.cs
У меня возник вопрос как эти классом пользоваться для журналирования действий в куче классов (например работы с БД)?
Нужно ли в конструкторы классов передавать экземпляр логера?
Например так:
DatabaseProvider.cs
SqlCeDbProvider.cs
ProjectTableAbstract.cs
ProjectTableSqlCe.cs
При таком подходе получается, что экземпляр логера протаскивается через несколько уровней.
Существуют ли другие способы бы работы с логером?
public interface ILogger
{
void Log(LogLevel logLevel, string Message);
}public class AppLogger: ILogger
{
private static StreamWriter sw;
private static string logFile;
public AppLogger(string LogName , string FilePath = "")
{
string path;
if (FilePath == string.Empty)
{
path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log");
if (!Directory.Exists(FilePath))
{
Directory.CreateDirectory(path);
}
}
else
{
path = FilePath;
}
logFile = Path.Combine(path, LogName);
sw = new StreamWriter(logFile, true, Encoding.UTF8, 1024);
sw.AutoFlush = true;
}
public void Log(LogLevel logLevel, string Message)
{
string str = string.Format("{0} ({1}): {2}",
logLevel.ToString().PadRight(8),
DateTime.Now.ToString("yyyy.MM.dd HH:MM:SS"),
Message
);
Debug.WriteLine(str);
sw.WriteLine(str);
}
}public enum LogLevel
{
None = 0,
Debug = 1,
Info = 2,
Warning = 3,
Error = 4,
}MyLogger = new AppLogger(LogName: "MyLog");
MyLogger.Log(LogLevel.Info, string.Format("Data Base type is {0}", Settings.ConnectionType));public abstract class DatabaseProvider
{
protected string CONNECT_STR = string.Empty;
protected IDbConnection CNN = null;
protected ILogger appLogger = null;
public DatabaseProvider(string connectStr, ILogger AppLogger )
{
CONNECT_STR = connectStr;
appLogger = AppLogger;
}
public abstract ProjectTableAbstract GetProjectTable();
public abstract FirstUsageTableAbstract GetFirstUsageTable();
public abstract OboznachenieTableAbstract GetOboznachenieTable();
public abstract LiteralTableAbstract GetLiteralTable();
public abstract IspolniteliTableAbstract GetIspolniteliTable();
public abstract InventarNumberTableAbstract GetInventarNumberTable();
public abstract MainTableAbstract GetMainTable();
}public class SqlCeDbProvider : DatabaseProvider
{
public SqlCeDbProvider(string connectStr, ILogger appLogger)
: base(connectStr, appLogger)
{
CNN = new SqlCeConnection(CONNECT_STR);
}
public override ProjectTableAbstract GetProjectTable()
{
return new ProjectTableSqlCe(CNN, appLogger);
}
// остальные таблицы опущенны
}public abstract class ProjectTableAbstract
{
protected IDbConnection CNN = null;
protected ILogger appLogger = null;
public ProjectTableAbstract(IDbConnection Connection, ILogger AppLogger)
{
CNN = Connection;
appLogger = AppLogger;
}
public abstract List<Project> GetEntities();
public abstract bool AddToDB(string value);
public abstract bool DeleteFromDB(string value, int id);
public abstract bool RenameInDB(string oldValue, string newValue, int oldValueId);
}public class ProjectTableSqlCe : ProjectTableAbstract
{
static SqlCeConnection SQLCeCon;
public ProjectTableSqlCe(IDbConnection Connection, ILogger AppLogger) : base(Connection, AppLogger)
{
SQLCeCon = (SqlCeConnection)CNN;
appLogger.Log(LogLevel.Info, string.Format("ProjectTable Init "));
}
public override List<Project> GetEntities()
{
List<Project> _lst = new List<Project>();
if (SQLCeCon.State == ConnectionState.Closed)
{
SQLCeCon.Open();
}
_lst.Clear();
CNN.Close();
appLogger.Log(LogLevel.Info, string.Format("Project count {0}", _lst.Count));
return _lst;
}
public override bool AddToDB(string value)
{
}
public override bool DeleteFromDB(string value, int id)
{
}
public override bool RenameInDB(string oldValue, string newValue, int oldValueId)
{
}
}Решение задачи: «Как правильно организовать Log в приложении?»
textual
Листинг программы
public static class MyLog()
{
private static readonly Lazy<MyLog> instanceHolder = new Lazy<MyLog>(() => new MyLog());
//Constructor, logic, settings
public static MyLog Instance => instanceHolder.Value;
}