Index: trac/env.py
===================================================================
--- trac/env.py	(revision 4543)
+++ trac/env.py	(working copy)
@@ -109,6 +109,26 @@
         
         Should be one of (`CRITICAL`, `ERROR`, `WARN`, `INFO`, `DEBUG`).""")
 
+    log_format = Option('logging', 'log_format', None,
+        """Custom logging format.
+
+        If nothing is set, the following will be used:
+        
+        Trac[$(module)s] $(levelname)s: $(message)s
+
+        Besides regular key names supported by the Python logger library
+        (see http://docs.python.org/lib/node422.html), one could use also:
+         - $(logid)s    the path for the current environment
+         - $(basename)s the last path component of the current environment
+         - $(project)s  the project name
+
+         Note the usage of `$(...)s` instead of `%(...)s` as the latter form
+         would be interpreted by the ConfigParser itself.
+
+         Example:
+         ($(thread)d) Trac[$(basename)s:$(module)s] $(levelname)s: $(message)s
+         """)
+
     def __init__(self, path, create=False, options=[]):
         """Initialize the Trac environment.
         
@@ -281,7 +301,10 @@
         logfile = self.log_file
         if logtype == 'file' and not os.path.isabs(logfile):
             logfile = os.path.join(self.get_log_dir(), logfile)
-        self.log = logger_factory(logtype, logfile, self.log_level, self.path)
+        self.log = logger_factory(logtype, logfile, self.log_level, self.path,
+                                  format=self.log_format,
+                                  project=self.project_name,
+                                  basename=os.path.basename(self.path))
 
     def get_known_users(self, cnx=None):
         """Generator that yields information about all known users, i.e. users
Index: trac/log.py
===================================================================
--- trac/log.py	(revision 4543)
+++ trac/log.py	(working copy)
@@ -20,32 +20,38 @@
 import sys
 
 def logger_factory(logtype='syslog', logfile=None, level='WARNING',
-                   logid='Trac'):
+                   logid='Trac', format=None, basename='', project=''):
     logger = logging.getLogger(logid)
     logtype = logtype.lower()
     if logtype == 'file':
         hdlr = logging.FileHandler(logfile)
-    elif logtype in ['winlog', 'eventlog', 'nteventlog']:
+    elif logtype in ('winlog', 'eventlog', 'nteventlog'):
         # Requires win32 extensions
         hdlr = logging.handlers.NTEventLogHandler(logid,
                                                   logtype='Application')
-    elif logtype in ['syslog', 'unix']:
+    elif logtype in ('syslog', 'unix'):
         hdlr = logging.handlers.SysLogHandler('/dev/log')
-    elif logtype in ['stderr']:
+    elif logtype in ('stderr'):
         hdlr = logging.StreamHandler(sys.stderr)
     else:
         hdlr = logging.handlers.BufferingHandler(0)
         # Note: this _really_ throws away log events, as a `MemoryHandler`
         # would keep _all_ records in case there's no target handler (a bug?)
 
-    format = 'Trac[%(module)s] %(levelname)s: %(message)s'
-    if logtype in ['file', 'stderr']:
-        format = '%(asctime)s ' + format 
+    if not format:
+        format = 'Trac[%(module)s] %(levelname)s: %(message)s'
+        if logtype in ('file', 'stderr'):
+            format = '%(asctime)s ' + format
+    else:
+        format = format.replace('$(', '%(')
+    format = format.replace('%(logid)s', logid) \
+             .replace('%(project)s', project) \
+             .replace('%(basename)s', basename)
     datefmt = ''
     if logtype == 'stderr':
         datefmt = '%X'        
     level = level.upper()
-    if level in ['DEBUG', 'ALL']:
+    if level in ('DEBUG', 'ALL'):
         logger.setLevel(logging.DEBUG)
     elif level == 'INFO':
         logger.setLevel(logging.INFO)
@@ -55,7 +61,7 @@
         logger.setLevel(logging.CRITICAL)
     else:
         logger.setLevel(logging.WARNING)
-    formatter = logging.Formatter(format,datefmt)
+    formatter = logging.Formatter(format, datefmt)
     hdlr.setFormatter(formatter)
     logger.addHandler(hdlr) 
 
