Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Общая переменная log


Автор: Lеstat 3.9.2006, 02:16
хочу вот сделать переменную класса log, которая была бы видна в любом файле проекта

вобщем сделал класс log
Код

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Diagnostics;

namespace SolarNet_Media
{
    public class log
    {
        public String filename = "log.txt";
        public FileStream file;
        public log() 
        {            
            file = new FileStream(filename,FileMode.Create);
            file.Close();
        }

        public log(String str)
        {
            file = new FileStream(str,FileMode.Create);
            filename = str;
            file.Close();
        }

        public void Clear()
        {
            file = new FileStream(filename,FileMode.Create);
            file.Close();
        }
        public void Add(String logStr)
        {
            DateTime Time = DateTime.Now;
            file = new FileStream(filename, FileMode.Open, FileAccess.Write);
            StreamWriter writer = new StreamWriter(file);
            writer.WriteLine(
                Time.Hour.ToString()+":"+Time.Minute.ToString()+" "+
                Time.Day.ToString()+"/"+
                Time.Month.ToString()+"/"+
                Time.Year.ToString()+": "+logStr);
            writer.Close();
            file.Close();
        }
    }
}



потом приходится в каждом другом классе где хочу вести лог создавать переменную ей уже логировать...
вобщем это глючит и стирает файл лога

Мне бы хотелось сделать в каком-нибудь одном месте переменную класса log
Код

public log Log = new log();

и чтобы потом я мог в любом файле/классе проекта писать просто
Код

Log.Add("Пишем строчку");


можно ли такое сделать? и если можно, то как? 

Автор: mr.DUDA 3.9.2006, 10:50

M
mr.DUDA
Lеstat, пожалуйста создавайте отдельную тему для нового вопроса. Этот был вынесен из темы про взаимодействие между формами.


По сути вопроса:

1) Чтобы все классы работали с единственным экземпляром log-а, можно использовать паттерн singleton: сделать конструктор приватным, и вынести наружу статическое свойство Instance (в переводе - единственный экземпляр):

Код
        private log() 
        {            
            file = new FileStream(filename,FileMode.Create);
            file.Close();
        }

        static log _instance; // изначально равен null
        
        public static log Instance
        {
            get
            {
                if(_instance == null)
                   _instance = new log(); // экземпляр создаётся только 1 раз
                return _instance; // всегда возвращается существующий
            }
        }

Тогда работать с логом можно вот так:
Код
log.Instance.Add(сообщение)

Либо можно все методы класса log сделать статическими, это кому как больше нравится.

2) Для протоколирования в .NET специально предусмотрены так называемые trace listener-ы - это класс, выводящий при отладке сообщения в окно output студии, а также в файл, event log, базу данных и т.п. - настраиваемый через .config файл приложения. Для вывода сообщения в trace, используется стандартный класс Trace пространства имён System.Diagnostics. Преимущество такого подхода - в настраиваемости (в конфиге можно также настроить уровень протоколирования - TraceLevel.Error, Warning, Info, Verbose и Off). Выводом в файл и т.п. занимается класс, унаследованный от TraceListener. Можно написать свой собственный или использовать, к примеру, TextWriterTraceListener.

Автор: Lеstat 3.9.2006, 14:41
Спасибо! Разобрался все работает!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)