[완료] 한개의 파일에 n개의 프로세스가 로그 작성하기.

mauri의 이미지

안녕하세요... __);

윈도우 서버에서 돌아가는 n개의 프로세스의 로그를 파일 하나에!! 작성해야 합니다.
(현재는 프로세스가 2개이지만 최대 4개까지 확장될듯 싶군요.)

이 로그 작성부를 DLL로 작성해서 제공해 주기로 했습니다.

작성하고 보니 로그가 빈번한지라..

중간에 깨지거나 아예 로그가 날아가버리는 문제가 발생하더군요.. ㅇㅅㅇ);;;;

그래서 락을 걸자! 라고 생각을 해서 DLL 내부에서 뮤텍스를 설정해서 걸어놓으니

아차!! 메모리가 공유될리가 만무하니.. 락이 걸리지가 않더군요.

이거 어떻게 해야 해결이 가능할까요?

아시는 분은 답변이나 링크라도 좀 부탁드립니다... __);

그럼 즐프되십시요~

shyblue의 이미지

msgq를 써서 msgq에 n개의 프로세서들이 로그를 남기도록 하고..
한개의 프로세서는 msgq를 읽어서 파일에 저장하는 구조면 간단할듯 합니다만????

時日也放聲大哭

時日也放聲大哭

mauri의 이미지


DllMain()에서 지정된 로그 파일명으로 파일을 공유모드로 엽니다.
CreateFile(szFilePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

각각의 프로세스에 DLL이 로드될때 DllMain을 달리게 되니, 여는것까지는 문제가 없습니다.

이 다음이 문제인건데요..

만일 DLL내에 메시지 큐를 줘봐야.. 각각의 프로세스에 로드될때 각각 메시지 큐를 가지게 되고..

큐에 로그가 들어오면 서로 쓰기 작업이 이루어지기 때문에 별다른 차이가 없을 듯 싶습니다.

forsuccess의 이미지

제 생각에는 DLL 외 어떤 윈도우를 가진 모니터 프로세스가 하나 있음 괜찬을꺼 같은데요.
모니터 프로세스가 기동할때 창조한 윈도우 핸들을 dll에 넘겨주고요.
dll에서는 로그 버퍼를 세팅하고 메시지를 큐에 보내고...
이런 식으로 함 안될까요?

많이 많이 배워주세요.

shyblue의 이미지

제가 얘기한건 IPC의 메세지 큐입니다. 윈도우즈에서 IPC를 사용해 보지 않아서, 잘 모르겠지만...
IPC상의 메세지큐라면, 하나의 메세지큐에 여러 프로세스가 메세지를 쌓고, 한개의 프로세스는 메세지큐에서 읽어서, 로그파일을 쓰기 모드로 열고, 기록하는것에 문제가 없다는 것입니다.

각각의 DLL이 로드될때마다 메세지큐를 생성하는 것이 아니라, 하나의 메세지큐를 프로세스간에 공유하는 것을 얘기한겁니다.
時日也放聲大哭

時日也放聲大哭

ganadist의 이미지

File Lock을 쓰는건 어떤가요?

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

mauri의 이미지

흰건 배경이고 검정은 영어라는것 외에는 모르겠습니다.;;
ㅠ.ㅠ);;

bejoy4him의 이미지

프로세스간 락킹이 가능한 세마포어를 쓰지 못하는 이유가 있나요?

뮤텍스 대신에 세마포어를 쓰면 될 것 같은데....

mauri의 이미지

삽질만 진장하고 있다가 님의 조언에 정신차렸습니다.

답변 감사드립니다.. ^^

JuEUS-U의 이미지

꼼수로 각 프로세스 로그에 Time Stamp 포함시켜서
나중에 결합하는건 안되나요 하하;;;

mauri의 이미지

혼란스럽게 해 드려서 죄송합니다.

그러고 보니 윈도우에서 뮤텍스를 써서 프로세스간 배타영역 생성이 안될리가 만무했습니다.. ㅠㅠ;;

파일이 깨지거나 로그가 날아가는 원인은 파일 포인터였습니다.

즉...

00001 20090101 110012 로그 어쩌고 저쩌고
(FP A)
(FP B)




이 상태에서 프로세스 A가 로그를 작성합니다.


00001 2009/01/01 11:00:12.100 로그 어쩌고 저쩌고
(FP B)
00002 2009/01/01 11:00:12.110 로그 어쩌고 저쩌고
(FP A)

ㄴ이렇게 되면 프로세스 B의 포인터는 그대로이고, B가 로그를 작성하게 되면..


00001 2009/01/01 11:00:12.100 로그 어쩌고 저쩌고 00003 2009/01/01 11:00:12.120 로그 어쩌고 저쩌고 (FP B) (FP A)

이렇게 되어버리니 로그가 사라지거나 깨지는 것처럼 보이는 것이었습니다.. __);

답변주신 모든분들 감사드립니다.. __);

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.