473,513 Members | 2,749 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

logging via SocketHandler and TCPserver

Every time I look at the logging module (up until now) I've given up and
continue to use my home-grown logger that I've been using for years. I'm not
giving up this time ;-)

I find that I REALLY need to be able to monitor LOTS of running
programs/processes and thought it would be nice to have them use SocketHandler
logging and then I would write TCPServer to accept the log messages for
real-time monitoring. I Googled (is that now a verb?) for several hours and
came up with some code that I've turned in to something that works, but I can't
figure out how to disconnect the server once it is connected The goal is to be
able to start TCPServer, monitor the log messages sent via SocketHandler logger,
disconnect, and move to the next application. Eventually I would like to wrap a
GUI around all of this for monitoring a complex web application.

Everything works, it just appears that I get into the while loop in
LogRecordStreamHandler.handle and it never breaks out (until I kill the client).
I can't seem to do anything with the LogRecordSocketReceiver.abort attribute to
make it quit.

I'm sure it is something simple (stupid?), but I've spent about 4 hours and I'm
not getting anywhere.

Thanks in advance for any assistance.

Regards,
Larry
Below is my code:

import sys
import time
import logging

if sys.argv[1] == 'client':
import logging.config

logging.config.fileConfig("logging.conf")

#create logger
logger = logging.getLogger("VESconsole")

while 1:
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")
time.sleep(2)

elif sys.argv[1] == 'server':
import cPickle
import logging.handlers
import SocketServer
import struct
import signal

class LogRecordStreamHandler(SocketServer.StreamRequestH andler):
"""Handler for a streaming logging request.

This basically logs the record using whatever logging policy is
configured locally.
"""

def handle(self):
"""
Handle multiple requests - each expected to be a 4-byte length,
followed by the LogRecord in pickle format. Logs the record
according to whatever policy is configured locally.
"""
while 1:
chunk = self.connection.recv(4)
if len(chunk) < 4:
break

slen = struct.unpack(">L", chunk)[0]
chunk = self.connection.recv(slen)
while len(chunk) < slen:
chunk = chunk + self.connection.recv(slen - len(chunk))

obj = self.unPickle(chunk)
record = logging.makeLogRecord(obj)
self.handleLogRecord(record)

def unPickle(self, data):
return cPickle.loads(data)

def handleLogRecord(self, record):
t = time.strftime('%a, %d %b %y %H:%M:%S',
time.localtime(record.created))

print "%s %s" % (t, record.getMessage())

class LogRecordSocketReceiver(SocketServer.ThreadingTCPS erver):
"""simple TCP socket-based logging receiver suitable for testing.
"""

allow_reuse_address = 1

def __init__(self, host='localhost',
port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
handler=LogRecordStreamHandler):

SocketServer.ThreadingTCPServer.__init__(self,
(host, port),
handler)
self.abort = 0
self.timeout = 1
self.logname = None

def serve_until_stopped(self):
import select
abort = 0
while not abort:
rd, wr, ex = select.select([self.socket.fileno()],
[], [],
self.timeout)
if rd:
self.handle_request()

abort = self.abort

print "serve_until_stopped exiting"

#
# Start ThreadingTCPServer instance to accept SocketHandler log
# messages from client.
#
tcpserver = LogRecordSocketReceiver()
print "Starting ThreadingTCPServer..."
tcpserver.serve_until_stopped()

'''
#-----logging.conf-----
[loggers]
keys=root

[handlers]
keys=socketHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=socketHandler

[handler_socketHandler]
class=handlers.SocketHandler
level=DEBUG
args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT)
host=localhost
port=DEFAULT_TCP_LOGGING_PORT

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=
'''
Jul 13 '08 #1
6 7560
On Jul 13, 9:25 pm, Larry Bates <larry.ba...@websafe.com`wrote:
Every time I look at theloggingmodule (up until now) I've given up and
continue to use my home-grown logger that I've been using for years. I'm not
giving up this time ;-)

I find that I REALLY need to be able to monitor LOTS of running
programs/processes and thought it would be nice to have them use SocketHandlerloggingand then I would write TCPServer to accept the log messages for
real-time monitoring. I Googled (is that now a verb?) for several hours and
came up with some code that I've turned in to something that works, but I can't
figure out how to disconnect the server once it is connected The goal is to be
able to start TCPServer, monitor the log messages sent via SocketHandler logger,
disconnect, and move to the next application. Eventually I would like to wrap a
GUI around all of this for monitoring a complex web application.

Everything works, it just appears that I get into the while loop in
LogRecordStreamHandler.handle and it never breaks out (until I kill the client).
I can't seem to do anything with the LogRecordSocketReceiver.abort attribute to
make it quit.

I'm sure it is something simple (stupid?), but I've spent about 4 hours and I'm
not getting anywhere.

Thanks in advance for any assistance.

Regards,
Larry

Below is my code:

import sys
import time
importlogging

if sys.argv[1] == 'client':
importlogging.config

logging.config.fileConfig("logging.conf")

#create logger
logger =logging.getLogger("VESconsole")

while 1:
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")
time.sleep(2)

elif sys.argv[1] == 'server':
import cPickle
importlogging.handlers
import SocketServer
import struct
import signal

class LogRecordStreamHandler(SocketServer.StreamRequestH andler):
"""Handler for a streamingloggingrequest.

This basically logs the record using whateverloggingpolicy is
configured locally.
"""

def handle(self):
"""
Handle multiple requests - each expected to be a 4-byte length,
followed by the LogRecord in pickle format. Logs the record
according to whatever policy is configured locally.
"""
while 1:
chunk = self.connection.recv(4)
if len(chunk) < 4:
break

slen = struct.unpack(">L", chunk)[0]
chunk = self.connection.recv(slen)
while len(chunk) < slen:
chunk = chunk + self.connection.recv(slen - len(chunk))

obj = self.unPickle(chunk)
record =logging.makeLogRecord(obj)
self.handleLogRecord(record)

def unPickle(self, data):
return cPickle.loads(data)

def handleLogRecord(self, record):
t = time.strftime('%a, %d %b %y %H:%M:%S',
time.localtime(record.created))

print "%s %s" % (t, record.getMessage())

class LogRecordSocketReceiver(SocketServer.ThreadingTCPS erver):
"""simple TCP socket-basedloggingreceiver suitable for testing.
"""

allow_reuse_address = 1

def __init__(self, host='localhost',
port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
handler=LogRecordStreamHandler):

SocketServer.ThreadingTCPServer.__init__(self,
(host, port),
handler)
self.abort = 0
self.timeout = 1
self.logname = None

def serve_until_stopped(self):
import select
abort = 0
while not abort:
rd, wr, ex = select.select([self.socket.fileno()],
[], [],
self.timeout)
if rd:
self.handle_request()

abort = self.abort

print "serve_until_stopped exiting"

#
# Start ThreadingTCPServer instance to accept SocketHandler log
# messages from client.
#
tcpserver = LogRecordSocketReceiver()
print "Starting ThreadingTCPServer..."
tcpserver.serve_until_stopped()

'''
#-----logging.conf-----
[loggers]
keys=root

[handlers]
keys=socketHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=socketHandler

[handler_socketHandler]
class=handlers.SocketHandler
level=DEBUG
args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT)
host=localhost
port=DEFAULT_TCP_LOGGING_PORT

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=
'''
Hi Larry,

You can make the server quit (set abort to True) by changing the logic
of the server appropriately. In your script (as in the example at
http://docs.python.org/lib/network-logging.html), nothing sets
server.abort, so the server never quits. If you were to insert a line
"self.server.abort = True" before the break in the check "if
len(chunk) < 4:", then the server will quit whenever a message shorter
than 4 bytes is received; ordinarily, a SocketHandler will always send
a 4-byte length followed by content. You can test this easily as
follows:

Run the server after modifying the script as described above.
Run the client and observe some messages printed by the server.
Kill the client. The server should still be waiting for events from
clients, though it might quit if, when you kill the client, a
truncated message is sent.
Run "telnet localhost 9020" and type a character.
The server should quit. If you make the "quitting" message a
raw_input() call, then you can see that the server has exited normally
via the abort flag.

Don't forget, the receiver can receive events from several
applications. You don't need to disconnect and reconnect. Simply have
each event sent by an app identify the app in some way - e.g. the
logger name could be "VESconsole.app1" for one app and
"VESconsole.app2" in another. In your server's handleRecord code, you
can get the logger name, decode the sending app from that and route
the event appropriately.

Another approach is to subclass SocketHandler and override the
makePickle method. This determines the wire format of the event sent
to the server, and if you change the wire format and modify the server
end to suit, then you can have any amount of flexibility in the
communications between the applications generating the events and the
server collating them.

I'm not sure why you've had so much trouble with logging in the past,
or why it took several hours of Googling to find a solution relating
to logging events across a network. I Googled for "python network
logging" and the link in the Python docs which I referenced earlier
was the first result, and hence also available via the "I'm Feeling
Lucky" button ;-)

Best regards,

Vinay
Jul 14 '08 #2
Vinay Sajip wrote:
On Jul 13, 9:25 pm, Larry Bates <larry.ba...@websafe.com`wrote:
>Every time I look at theloggingmodule (up until now) I've given up and
continue to use my home-grown logger that I've been using for years. I'm not
giving up this time ;-)

I find that I REALLY need to be able to monitor LOTS of running
programs/processes and thought it would be nice to have them use SocketHandlerloggingand then I would write TCPServer to accept the log messages for
real-time monitoring. I Googled (is that now a verb?) for several hours and
came up with some code that I've turned in to something that works, but I can't
figure out how to disconnect the server once it is connected The goal is to be
able to start TCPServer, monitor the log messages sent via SocketHandler logger,
disconnect, and move to the next application. Eventually I would like to wrap a
GUI around all of this for monitoring a complex web application.

Everything works, it just appears that I get into the while loop in
LogRecordStreamHandler.handle and it never breaks out (until I kill the client).
I can't seem to do anything with the LogRecordSocketReceiver.abort attribute to
make it quit.

I'm sure it is something simple (stupid?), but I've spent about 4 hours and I'm
not getting anywhere.

Thanks in advance for any assistance.

Regards,
Larry

Below is my code:

import sys
import time
importlogging

if sys.argv[1] == 'client':
importlogging.config

logging.config.fileConfig("logging.conf")

#create logger
logger =logging.getLogger("VESconsole")

while 1:
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")
time.sleep(2)

elif sys.argv[1] == 'server':
import cPickle
importlogging.handlers
import SocketServer
import struct
import signal

class LogRecordStreamHandler(SocketServer.StreamRequestH andler):
"""Handler for a streamingloggingrequest.

This basically logs the record using whateverloggingpolicy is
configured locally.
"""

def handle(self):
"""
Handle multiple requests - each expected to be a 4-byte length,
followed by the LogRecord in pickle format. Logs the record
according to whatever policy is configured locally.
"""
while 1:
chunk = self.connection.recv(4)
if len(chunk) < 4:
break

slen = struct.unpack(">L", chunk)[0]
chunk = self.connection.recv(slen)
while len(chunk) < slen:
chunk = chunk + self.connection.recv(slen - len(chunk))

obj = self.unPickle(chunk)
record =logging.makeLogRecord(obj)
self.handleLogRecord(record)

def unPickle(self, data):
return cPickle.loads(data)

def handleLogRecord(self, record):
t = time.strftime('%a, %d %b %y %H:%M:%S',
time.localtime(record.created))

print "%s %s" % (t, record.getMessage())

class LogRecordSocketReceiver(SocketServer.ThreadingTCPS erver):
"""simple TCP socket-basedloggingreceiver suitable for testing.
"""

allow_reuse_address = 1

def __init__(self, host='localhost',
port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
handler=LogRecordStreamHandler):

SocketServer.ThreadingTCPServer.__init__(self,
(host, port),
handler)
self.abort = 0
self.timeout = 1
self.logname = None

def serve_until_stopped(self):
import select
abort = 0
while not abort:
rd, wr, ex = select.select([self.socket.fileno()],
[], [],
self.timeout)
if rd:
self.handle_request()

abort = self.abort

print "serve_until_stopped exiting"

#
# Start ThreadingTCPServer instance to accept SocketHandler log
# messages from client.
#
tcpserver = LogRecordSocketReceiver()
print "Starting ThreadingTCPServer..."
tcpserver.serve_until_stopped()

'''
#-----logging.conf-----
[loggers]
keys=root

[handlers]
keys=socketHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=socketHandler

[handler_socketHandler]
class=handlers.SocketHandler
level=DEBUG
args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT)
host=localhost
port=DEFAULT_TCP_LOGGING_PORT

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=
'''

Hi Larry,

You can make the server quit (set abort to True) by changing the logic
of the server appropriately. In your script (as in the example at
http://docs.python.org/lib/network-logging.html), nothing sets
server.abort, so the server never quits. If you were to insert a line
"self.server.abort = True" before the break in the check "if
len(chunk) < 4:", then the server will quit whenever a message shorter
than 4 bytes is received; ordinarily, a SocketHandler will always send
a 4-byte length followed by content. You can test this easily as
follows:

Run the server after modifying the script as described above.
Run the client and observe some messages printed by the server.
Kill the client. The server should still be waiting for events from
clients, though it might quit if, when you kill the client, a
truncated message is sent.
Run "telnet localhost 9020" and type a character.
The server should quit. If you make the "quitting" message a
raw_input() call, then you can see that the server has exited normally
via the abort flag.

Don't forget, the receiver can receive events from several
applications. You don't need to disconnect and reconnect. Simply have
each event sent by an app identify the app in some way - e.g. the
logger name could be "VESconsole.app1" for one app and
"VESconsole.app2" in another. In your server's handleRecord code, you
can get the logger name, decode the sending app from that and route
the event appropriately.

Another approach is to subclass SocketHandler and override the
makePickle method. This determines the wire format of the event sent
to the server, and if you change the wire format and modify the server
end to suit, then you can have any amount of flexibility in the
communications between the applications generating the events and the
server collating them.

I'm not sure why you've had so much trouble with logging in the past,
or why it took several hours of Googling to find a solution relating
to logging events across a network. I Googled for "python network
logging" and the link in the Python docs which I referenced earlier
was the first result, and hence also available via the "I'm Feeling
Lucky" button ;-)

Best regards,

Vinay
Vinay,

Thanks for your detailed explanation, but IMHO your suggested solution is almost
the opposite (right idea wrong direction) of what I'm looking for. Hypothetical
setup:
application1 - SocketHandler logging turned on
application2 - SocketHandler logging turned on
application3 - SocketHandler logging turned on
..
..
..
applicationN

monitoring app - ThreadingTCPServer target that Allows user to connect to ANY
running application and to view the real-time log messages. After monitoring,
it should be able to disconnect and connect to another application... The
clients (application1..N) never stop sending and don't ever send anything short
to disconnect themselves from the monitoring application. The disconnect/
reconnect is done at the monitoring app end based on input from the user. I
think each one would be logging to a different port, but I never really quite
got that far. Perhaps there is some other way that I'm missing. It seems like
this is something that might be able to be "generalized" into a robust
monitoring application for an arbitrary number of asynchronously running
applications.

Each application's real-time log might be reached by clicking on a tab, menu, etc.

As to the difficulty, I might just have a mental block but two modules that I've
had a real hard time getting my mind wrapped around is your Logging and Twisted.
They both have a multitude of options/ways to be used and not very many working
examples to work from. Might be a chance to make some money on a book. If it
was full of examples, I'd purchase it.

Regards,
Larry
Jul 14 '08 #3
On Jul 14, 11:16 pm, Larry Bates <larry.ba...@websafe.com`wrote:
Vinay,

Thanks for your detailed explanation, but IMHO your suggested solution is almost
the opposite (right idea wrong direction) of what I'm looking for. Hypothetical
setup:

application1 - SocketHandlerloggingturned on
application2 - SocketHandlerloggingturned on
application3 - SocketHandlerloggingturned on
.
.
.
applicationN

monitoring app - ThreadingTCPServer target that Allows user to connect to ANY
running application and to view the real-time log messages. After monitoring,
it should be able to disconnect and connect to another application... The
clients (application1..N) never stop sending and don't ever send anything short
to disconnect themselves from the monitoring application. The disconnect/
reconnect is done at the monitoring app end based on input from the user. I
think each one would beloggingto a different port, but I never really quite
got that far. Perhaps there is some other way that I'm missing. It seems like
this is something that might be able to be "generalized" into a robust
monitoring application for an arbitrary number of asynchronously running
applications.

Each application's real-time log might be reached by clicking on a tab, menu, etc.
Here's how I see it: the socket server listens, and receives logging
events from numerous applications in real time. If the server is
configured to monitor app1, then it quietly discards (or doesn't show
in the UI) all events from other apps - it only collects/shows events
from app1. When you click on a tab/menu/whatever to switch to
monitoring app2, then this information is used to tell the server to
discard (or not show) events from all apps except app2. You would of
course need to ensure the communication between UI thread and server
thread were done in a thread-safe manner.
As to the difficulty, I might just have a mental block but two modules that I've
had a real hard time getting my mind wrapped around is yourLoggingand Twisted.
They both have a multitude of options/ways to be used and not very many working
examples to work from. Might be a chance to make some money on a book. If it
was full of examples, I'd purchase it.
But there are numerous examples in the logging docs - the script you
quoted as having put together after several hours of Googling is
pretty much the same as the (working) version in the logging docs! If
you have reviewed the logging docs and find them lacking examples,
please provide more detail about the kind of examples you think are
missing. And I can't speak for Twisted, but it does a lot more than
logging - and I don't think there's enough complexity in Python
logging to warrant a paid-for book. (No doubt people will tell me if
they disagree!)

Best regards,

Vinay Sajip
Jul 15 '08 #4
Vinay Sajip wrote:
On Jul 14, 11:16 pm, Larry Bates <larry.ba...@websafe.com`wrote:
>Vinay,

Thanks for your detailed explanation, but IMHO your suggested solution is almost
the opposite (right idea wrong direction) of what I'm looking for. Hypothetical
setup:

application1 - SocketHandlerloggingturned on
application2 - SocketHandlerloggingturned on
application3 - SocketHandlerloggingturned on
.
.
.
applicationN

monitoring app - ThreadingTCPServer target that Allows user to connect to ANY
running application and to view the real-time log messages. After monitoring,
it should be able to disconnect and connect to another application... The
clients (application1..N) never stop sending and don't ever send anything short
to disconnect themselves from the monitoring application. The disconnect/
reconnect is done at the monitoring app end based on input from the user. I
think each one would beloggingto a different port, but I never really quite
got that far. Perhaps there is some other way that I'm missing. It seems like
this is something that might be able to be "generalized" into a robust
monitoring application for an arbitrary number of asynchronously running
applications.

Each application's real-time log might be reached by clicking on a tab, menu, etc.

Here's how I see it: the socket server listens, and receives logging
events from numerous applications in real time. If the server is
configured to monitor app1, then it quietly discards (or doesn't show
in the UI) all events from other apps - it only collects/shows events
from app1. When you click on a tab/menu/whatever to switch to
monitoring app2, then this information is used to tell the server to
discard (or not show) events from all apps except app2. You would of
course need to ensure the communication between UI thread and server
thread were done in a thread-safe manner.
>As to the difficulty, I might just have a mental block but two modules that I've
had a real hard time getting my mind wrapped around is yourLoggingand Twisted.
They both have a multitude of options/ways to be used and not very many working
examples to work from. Might be a chance to make some money on a book. If it
was full of examples, I'd purchase it.

But there are numerous examples in the logging docs - the script you
quoted as having put together after several hours of Googling is
pretty much the same as the (working) version in the logging docs! If
you have reviewed the logging docs and find them lacking examples,
please provide more detail about the kind of examples you think are
missing. And I can't speak for Twisted, but it does a lot more than
logging - and I don't think there's enough complexity in Python
logging to warrant a paid-for book. (No doubt people will tell me if
they disagree!)

Best regards,

Vinay Sajip
Can multiple applications send SocketHandler logging records to the same socket
server on the same port simultaneously? If so, then I understand your answer
completely and will go in that direction. I guess I was trying to not use up
bandwidth/CPU cycles on the applications that weren't being actively monitored
by just not having the socket server connected to them.

I think you may be a 'little to close' to the (excellent) application you have
written to understand the steep learning curve that I see. You know the saying,
"Brain surgery is easy to a brain surgeon". I should point out that I'm no
newbie. I've used PIL, ReportLab, BeautifulSoup, Mechanize, Win32 extensions,
ElementTree and a whole host of other modules with less difficulty. Please
don't take this as anything more than an observation on my part. From what I
see, you have written (and generously donated) an extremely powerful library and
it is greatly appreciated. It is most likely just me.

As far as the book is concerned, I guess I'd purchase the only copy ;-).

I do appreciate your help very much.

Regards,
Larry
Jul 15 '08 #5
Larry Bates <la*********@websafe.com`writes:
Can multiple applications send SocketHandler logging records to the
same socket server on the same port simultaneously?
Of course they can. Server can accept requests from many clients.
You have used `SocketServer.ThreadingTCPServer`. That server for example
handles every request in a different thread.
If so, then I understand your answer completely and will go
in that direction. I guess I was trying to not use up
bandwidth/CPU cycles on the applications that weren't being actively
monitored by just not having the socket server connected to them.

I think you may be a 'little to close' to the (excellent) application
you have written to understand the steep learning curve that I see.
You know the saying, "Brain surgery is easy to a brain surgeon". I
should point out that I'm no newbie. I've used PIL, ReportLab,
BeautifulSoup, Mechanize, Win32 extensions, ElementTree and a whole
host of other modules with less difficulty. Please don't take this as
anything more than an observation on my part. From what I see, you
have written (and generously donated) an extremely powerful library
and it is greatly appreciated. It is most likely just me.
Well, I know what you mean. I had troubles to understand that library
either. Logging docs are quite good as a reference, but there is lack
of a good introductory tutorial. Now when I know `logging` I can't live
without it, but the start wasn't easy.
I shouldn't say it here, but I found helpful docs to the similar
library in Java. ;)
http://logging.apache.org/log4j/1.2/manual.html

There are many differences (e.g. Appenders vs Handlers), but the rule
is the same.
As far as the book is concerned, I guess I'd purchase the only copy ;-).
"The Art of Logging" - four volumes. ;-)

Regards,
Rob
Jul 15 '08 #6
Rob Wolfe wrote:
Larry Bates <la*********@websafe.com`writes:
>Can multiple applications send SocketHandler logging records to the
same socket server on the same port simultaneously?

Of course they can. Server can accept requests from many clients.
You have used `SocketServer.ThreadingTCPServer`. That server for example
handles every request in a different thread.
>If so, then I understand your answer completely and will go
in that direction. I guess I was trying to not use up
bandwidth/CPU cycles on the applications that weren't being actively
monitored by just not having the socket server connected to them.

I think you may be a 'little to close' to the (excellent) application
you have written to understand the steep learning curve that I see.
You know the saying, "Brain surgery is easy to a brain surgeon". I
should point out that I'm no newbie. I've used PIL, ReportLab,
BeautifulSoup, Mechanize, Win32 extensions, ElementTree and a whole
host of other modules with less difficulty. Please don't take this as
anything more than an observation on my part. From what I see, you
have written (and generously donated) an extremely powerful library
and it is greatly appreciated. It is most likely just me.

Well, I know what you mean. I had troubles to understand that library
either. Logging docs are quite good as a reference, but there is lack
of a good introductory tutorial. Now when I know `logging` I can't live
without it, but the start wasn't easy.
I shouldn't say it here, but I found helpful docs to the similar
library in Java. ;)
http://logging.apache.org/log4j/1.2/manual.html

There are many differences (e.g. Appenders vs Handlers), but the rule
is the same.
>As far as the book is concerned, I guess I'd purchase the only copy ;-).

"The Art of Logging" - four volumes. ;-)

Regards,
Rob
Five volumes if you add in "Logging within Frameworks (Django, TurboGears, and
Pylons" ;-).

Now on to UnitTesting (I use a home-grown method), Twisted, and other things I
can't seem to find time to get my brain around...

-Larry
Jul 15 '08 #7

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
1444
by: Samir Patel | last post by:
First of all, hats of on logging module in python 2.3. Very elegant... I have 2 questions regarding Handler class in logging: 1. SocketHandler: Can I send plain string instead of pickle...
2
5807
by: Kamus of Kadizhar | last post by:
Thanks to Robert Brewer, I got enough insight into logging to make it work.... Now I have another issue: file locking. Sorry if this is a very basic question, but I can't find a handy reference...
0
1226
by: Chris Curvey | last post by:
Hi all, I just upgraded to 2.4.3 (from 2.4.1) on Windows. Now each time I run my unit tests, they always throw this error at the end of the test run: Error in atexit._run_exitfuncs:...
6
2473
by: Ant | last post by:
Hi all, I'm putting together a simple help module for my applications, using html files stored in the application directory somewhere. Basically it sets up a basic web server, and then uses the...
3
4282
by: Ross Boylan | last post by:
I would like my different threads to log without stepping on each other. Past advice on this list (that I've found) mostly says to send the messages to a Queue. That would work, but bypasses...
5
2652
by: =?UTF-8?B?UmFmYcWC?= Zawadzki | last post by:
Hello. As I saw in logging source - there is no lock per file during making emit() (only lock per thread). So, my question is - is it safe to log into one file using many processess uses...
3
2909
by: evenrik | last post by:
An a redhat box I have root, apache and other normal users run code that uses the logging module to write to the same log file. Since umasks are set to 2 or 022 this gets permission errors. I...
6
1247
by: writeson | last post by:
Hi all, On our Linux systems at work I've written a Twisted logging server that receives log messages from multiple servers/processes to post them to a log file, essentially serializing all the...
4
1606
by: samwyse | last post by:
In the Python 2.5 Library Reference, section 14.5.3 (Logging to multiple destinations), an example is given of logging to both a file and the console. This is done by using logging.basicConfig()...
0
7259
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
7158
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
7535
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
1
7098
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
7523
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
5683
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
4745
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
0
3232
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The...
0
1592
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.