타사 라이브러리를 사용하지 않고 C #으로 로그인하려면 어떻게해야합니까? [닫은]


92

내 응용 프로그램에서 로깅을 구현하고 싶지만 log4net과 같은 외부 프레임 워크를 사용하지 않습니다.

그래서 파일에 DOS의 에코 와 같은 작업을하고 싶습니다 . 가장 효과적인 방법은 무엇입니까?

외부 프레임 워크를 사용하지 않고 기록 된 처리되지 않은 예외를 기록하는 방법이 있습니까?


1
기본 제공 System.Diagnostics.TraceSource를 사용할 수 있습니다 . <br> 다음은 기본 제공 추적 수신기 + FileLogTraceListener 목록입니다 . 웹에는 이와 같은 많은 매뉴얼 이 있습니다 . [또는 Jeff Atwood
의이 문서

2
log4net보다 엔터프라이즈 라이브러리가 더 나은 옵션이라고 생각합니다.
hungryMind

간단한 콘솔 로깅 만 찾고 있다면 System.Diagnostics.Tracing이 적합 할 것입니다. Trace는 Console (Trace.WriteLine)처럼 사용할 수 있습니다.
Paul

답변:


66
public void Logger(string lines)
{
  //Write the string to a file.append mode is enabled so that the log
  //lines get appended to  test.txt than wiping content and writing the log

  using(System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\test.txt", true))
  {
    file.WriteLine(lines);
  }
}

자세한 내용은 MSDN


22
usingon file 을 사용해야 하지만, 메서드에 로컬이기 때문에 어쨌든 곧 폐기 될 것입니다.
markmnl

19
또한 file.WriteLine(lines);예외가 발생하면 코드가 file.Close();. 을 사용하는 using것은 try { // using block } finally { // Dispose }. 객체가 내부 코드하더라도 배치되도록하는 수단이 using블록 예외 슬로우
Memet 올슨

6
로깅이 완료되기 전에이 메서드를 다시 호출하면 어떻게됩니까? 오류가 발생합니다. 'C : \ test.txt'파일이 다른 프로세스에서 사용 중이므로 해당 프로세스가 액세스 할 수 없습니다. 누구든지이 문제에 대해 알고 있습니까?
Mike Sportsman

23

나는 log4j.net과 같은 외부 프레임 워크를 사용하지 않을 것입니다.

왜? Log4net은 아마도 대부분의 요구 사항을 해결할 것입니다. 예를 들어이 클래스를 확인하십시오 : RollingFileAppender .

Log4net은 잘 문서화되어 있으며 웹에는 수천 개의 리소스와 사용 사례가 있습니다.


3
그 이유는 .net에서 외부 libs를 사용한 적이 없기 때문에 먼저 수행하는 방법을 배워야합니다.)
IAdapter

4
프로젝트에 대한 참조를 추가하고 XML 구성을 배치하기 만하면됩니다. 정말 쉽습니다. log4net 자습서를위한 Google 및 가장 적합한 것을 선택하십시오.
empi

23
Nuget을 사용하십시오. 바람이 될 것이다 외부 라이브러리를 사용하여
heneryville

36
왜 그렇게 많은 찬성 투표를합니까? 질문은 두 번 OP가 외부 프레임 워크를 사용하고 싶지 않으며 Log4net을 원하지 않는다고 명시 적으로 언급합니다. 확실히 이것은 답변이 아니라 코멘트 여야합니까?
RyanfaeScotland

9
@RyanfaeScotland 당신 말이 맞아요, 아마도 OP에 맞지 않을 수도 있지만 이것이 공개 사이트라는 것을 잊지 마십시오. 질문의 제목에는 "C #으로 로그인하는 방법"만 나와 있으므로 라이브러리를 사용해도 괜찮은 저와 같은 사람들도 여기에 도착하여이 답변이 유용하다는 것을 알게 될 것입니다. 사실,이 스레드는 "c # logging"을 검색했을 때 첫 번째 결과였습니다.
swenzel 2016

18

이벤트 로그에 직접 쓸 수 있습니다. 다음 링크를 확인하십시오.
http://support.microsoft.com/kb/307024
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx

다음은 MSDN의 샘플입니다.

using System;
using System.Diagnostics;
using System.Threading;

class MySample{

    public static void Main(){

        // Create the source, if it does not already exist.
        if(!EventLog.SourceExists("MySource"))
        {
             //An event log source should not be created and immediately used.
             //There is a latency time to enable the source, it should be created
             //prior to executing the application that uses the source.
             //Execute this sample a second time to use the new source.
            EventLog.CreateEventSource("MySource", "MyNewLog");
            Console.WriteLine("CreatedEventSource");
            Console.WriteLine("Exiting, execute the application a second time to use the source.");
            // The source is created.  Exit the application to allow it to be registered.
            return;
        }

        // Create an EventLog instance and assign its source.
        EventLog myLog = new EventLog();
        myLog.Source = "MySource";

        // Write an informational entry to the event log.    
        myLog.WriteEntry("Writing to event log.");

    }
}

1
다른 클래스에서 동일한 EventLog를 사용하는 가장 좋은 방법은 무엇입니까? 생성자에서 매개 변수로 전달 하시겠습니까? 일부 싱글 톤 클래스에서 정적으로 액세스합니까? 아니면 더 나은 것이 있습니까?
dpelisek

15

정말 간단한 기록 방법을 찾고 있다면이 라이너를 사용할 수 있습니다. 파일이 없으면 생성됩니다.

System.IO.File.AppendAllText(@"c:\log.txt", "mymsg\n");

이 솔루션의 문제점은 IO 작업을 추가한다는 것입니다. 그것을 사용 그래서 로깅 배치 알고리즘 작업을하지 않는 것이 좋습니다
라미 Yampolsky

@RamiYampolsky, 무슨 말인지 이해가 안 돼요.
dan-gph

@ dan-gph 많은 CPU 작업을 수행하는 일부 코드를 구현하는 경우이 코드 중에 로깅하는 경우 구현하려는 실제 알고리즘 대신 로깅을위한 시간이 "낭비"됩니다. 따라서 가능한 한 짧은 시간을 "폐기"하는 것을 선호합니다. 위의 예와 같이 IO 작업을 수행하는 것은 정말 길기 때문에 코드에 로깅 명령이 많으면 전체 실행이 약 1000 배 느려질 수 있습니다!
Rami Yampolsky

@RamiYampolsky, 방금 코드 루프를 100,000 번 만들었고 10 초가 걸렸습니다. 따라서 초당 10,000 개의 로그 항목이 있으며 항목 당 0.01 마이크로 초입니다. 1 초에 10 개의 항목을 기록했다면 0.1 마이크로 초가 걸립니다. 그래서 아니, 그것은 전혀 오버 헤드가 아닙니다.
dan-gph

@ dan-gph 다른 사용 사례와 관련된 내 대답. 단순성을 위해 계산을하는 100,000 번 반복을 시도하고 sum + = i를 수행 한 다음 로그를 수행하십시오. 함께하고 로그없이 시도
라미 Yampolsky

7

ELMAH를 발견 할 때까지 내 자신의 오류 로깅을 작성했습니다 . ELMAH만큼 완벽하게 이메일 부분을 다운받을 수 없었습니다.


내 추론을 위해 내 empi의 의견을 확인하십시오.
IAdapter

ELMAH는 너무 간단해서 재미도 없습니다. 말 그대로 웹 구성에 몇 줄을 추가하여 사용할 수 있습니다.
jonezy

또한 귀하의 앱이 언제 / 파열되기 시작 하는지를 알기위한 요구 사항 측면에서 elmah가 이메일을 보낼 수있는 기능 때문에 대부분의 다른 것보다 낫다는 것을 알았습니다. 서버가 작동하는 한 오류 이메일을 받게됩니다. 엘마.
jonezy

6

.NET에 가깝게 유지 하려면 Enterprise Library Logging Application Block을 확인하십시오 . 봐 여기 . 또는 빠른 시작 자습서를 보려면 이를 확인 하십시오 . 저는 엔터프라이즈 라이브러리의 유효성 검사 응용 프로그램 블록을 사용했으며 제 요구 사항에 정말 적합하며 프로젝트에서 "상속"(설치 및 참조!)하기가 매우 쉽습니다.


4

사용자 지정 오류 로깅을 원하는 경우 쉽게 고유 한 코드를 작성할 수 있습니다. 내 프로젝트 중 하나에서 발췌 한 내용을 알려 드리겠습니다.

public void SaveLogFile(object method, Exception exception)
{
    string location = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\FolderName\";
    try
    {
        //Opens a new file stream which allows asynchronous reading and writing
        using (StreamWriter sw = new StreamWriter(new FileStream(location + @"log.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite)))
        {
            //Writes the method name with the exception and writes the exception underneath
            sw.WriteLine(String.Format("{0} ({1}) - Method: {2}", DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString(), method.ToString()));
            sw.WriteLine(exception.ToString()); sw.WriteLine("");
        }
    }
    catch (IOException)
    {
        if (!File.Exists(location + @"log.txt"))
        {
            File.Create(location + @"log.txt");
        }
    }
}

그런 다음 실제로 오류 로그에 쓰 q려면 (catch 된 예외가 됨)

SaveLogFile(MethodBase.GetCurrentMethod(), `q`);

7
파일이 아직 존재하지 않으면 첫 번째 항목이 누락된다는 것을 알고 있습니까?
oɔɯǝɹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.