Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/76: Рейтинг темы: голосов - 76, средняя оценка - 4.87
4 / 4 / 3
Регистрация: 15.12.2015
Сообщений: 184

Как правильно организовать Log в приложении?

15.06.2017, 00:30. Показов 15251. Ответов 21

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Я хочу организовать в своем проекте логирование. Для этого набросал класс-логер.
ILogger.cs
Кликните здесь для просмотра всего текста

C#
1
2
3
4
public interface ILogger
{
    void Log(LogLevel logLevel, string Message);
}


Logger.cs
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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);
    }
}



LogLevel.cs
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
public enum LogLevel
{
    None    = 0,
    Debug   = 1,
    Info    = 2,
    Warning = 3,
    Error   = 4,
}


Пример применения
Program.cs
Кликните здесь для просмотра всего текста

C#
1
2
MyLogger = new AppLogger(LogName: "MyLog");
MyLogger.Log(LogLevel.Info, string.Format("Data Base type is {0}", Settings.ConnectionType));


У меня возник вопрос как эти классом пользоваться для журналирования действий в куче классов (например работы с БД)?
Нужно ли в конструкторы классов передавать экземпляр логера?

Например так:

DatabaseProvider.cs
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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();
}


SqlCeDbProvider.cs
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
    }
    // остальные таблицы опущенны
}


ProjectTableAbstract.cs
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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);
 
    }


ProjectTableSqlCe.cs
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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)
        {
        }
   }

При таком подходе получается, что экземпляр логера протаскивается через несколько уровней.

Существуют ли другие способы бы работы с логером?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.06.2017, 00:30
Ответы с готовыми решениями:

Как правильно организовать работу с переменными в многопоточном приложении
Здравствуйте. Вот такой код: int min = 1, max = 1000; private void main() { for(int i=0;i&lt;10;i++) { Thread th = new...

Как лучше организовать права доступа в приложении?
сделал две формы Form1 и Form2. В одной форме проходит регистрация пользователя(данные пароль и имя хранятся в бд mssql).При удачной...

Как правильно организовать?
У меня есть несколько классов и у них практически одинаковые функции, которые отличается парой типов, как мне правильно сделать базовые...

21
4 / 4 / 3
Регистрация: 15.12.2015
Сообщений: 184
16.06.2017, 14:14  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от aquaMakc Посмотреть сообщение
2) Библиотека ничего не должна знать о приложении, которое её вызывает, как и логировать свои действия. Логирование целиком и полностью ложится на плечи приложухи.
У меня библиотека не связана с приложением, а приложение только дергает методы из приложения и передает данные в контролы.
Как я уже писал, в библиотеку внесена вся логика включая и класс логера.
Логирование работы с БД проходит в соответствующих классах в библиотеке.

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public abstract class ProjectTableAbstract
{
    protected IDbConnection CNN = null;
    protected ILogger appLogger = null;
 
    public ProjectTableAbstract(IDbConnection Connection, ILogger AppLogger)
    {
        CNN = Connection;
        appLogger = AppLogger;
    }
 
    // другие методы
}
 
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;
    }
    //другие методы
}


Вопрос...
Если я сделаю класс логогер статическим, то смогу вызывать из любого места

C#
1
public static class AppLogger: ILogger
Применение:
C#
1
2
3
4
5
6
7
8
9
10
11
public class ProjectTableSqlCe : ProjectTableAbstract
{
 
    public override List<Project> GetEntities()
    {
        //код метода
        AppLogger.Log(LogLevel.Info, string.Format("Project count {0}", _lst.Count));
        //код метода;
    }
    //другие методы
}
и так же вызывать логер из приложения.

Только нужно будет создать метод для определения файла в который буду сохранять лог. А в случае если файл не определен до вызова Log(), то или выбрасывать исключение или задать некий файл по умолчанию.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
22.06.2017, 14:08
RuS_984, вам же предложили Singleton. Сообщение №5. И вызывайте где хотите, если сборка, содержащая класс логера загружена в память или подключена в свойствах проекта.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.06.2017, 14:08

Как правильно организовать исключение
Подскажите пожалуйста, как правильно организовать такое исключение: Создан массив, если в нем есть &quot;2&quot;, выводится сообщение о...

Как правильно организовать цикл for?
Имеем два числа, например 30 и 42 Нужно в цикле перебрать их например 3 раза по следующему алгоритму: int x = 30; int y = 42; ...

Как правильно организовать многопоточность?
Всем привет! Если кратко Мне нужно организовать выполнение одной большой не цикловой задачи в отдельном потоке. При этом нужно 1....

Как правильно организовать GET-запрос на сайт?
подскажите плз как правильно сделать GET запрос на сайт, предназначен он для добавления комментария, в фаербаге посмотрел, что запрос...

Как правильно организовать Unit Test?
Доброго времени суток. Никак не могу разобраться в этом тестировании, прошу вашей помощи. Есть программа: namespace ConsoleApplication1 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru