Index: twisted/python/log.py
===================================================================
--- twisted/python/log.py	(revision 25177)
+++ twisted/python/log.py	(working copy)
@@ -384,12 +384,12 @@
 
         tzOffset = -self.getTimezoneOffset(when)
         when = datetime.utcfromtimestamp(when + tzOffset)
-        tzHour = int(tzOffset / 60 / 60)
-        tzMin = int(tzOffset / 60 % 60)
-        return '%d-%02d-%02d %02d:%02d:%02d%+03d%02d' % (
+        tzSign = tzOffset >= 0 and '+' or '-'
+        tzHour, tzMinute = divmod(abs(tzOffset) // 60, 60)
+        return '%04d-%02d-%02dT%02d:%02d:%02d.%06d%s%02d%02d' % (
             when.year, when.month, when.day,
-            when.hour, when.minute, when.second,
-            tzHour, tzMin)
+            when.hour, when.minute, when.second, when.microsecond,
+            tzSign, tzHour, tzMinute)
 
     def emit(self, eventDict):
         text = textFromEventDict(eventDict)
Index: twisted/test/test_log.py
===================================================================
--- twisted/test/test_log.py	(revision 25177)
+++ twisted/test/test_log.py	(working copy)
@@ -319,27 +319,27 @@
         """
         # There is no function in the time module which converts a UTC time
         # tuple to a timestamp.
-        when = time.mktime((2001, 2, 3, 4, 5, 6, 7, 8, 0)) - time.timezone
+        when = time.mktime((2001, 2, 3, 4, 5, 6, 7, 8, 0)) - time.timezone + 0.123
 
         # Pretend to be in US/Eastern for a moment
         self.flo.getTimezoneOffset = lambda when: 18000
-        self.assertEquals(self.flo.formatTime(when), '2001-02-02 23:05:06-0500')
+        self.assertEquals(self.flo.formatTime(when), '2001-02-02T23:05:06.123000-0500')
 
         # Okay now we're in Eastern Europe somewhere
         self.flo.getTimezoneOffset = lambda when: -3600
-        self.assertEquals(self.flo.formatTime(when), '2001-02-03 05:05:06+0100')
+        self.assertEquals(self.flo.formatTime(when), '2001-02-03T05:05:06.123000+0100')
 
         # And off in the Pacific or someplace like that
         self.flo.getTimezoneOffset = lambda when: -39600
-        self.assertEquals(self.flo.formatTime(when), '2001-02-03 15:05:06+1100')
+        self.assertEquals(self.flo.formatTime(when), '2001-02-03T15:05:06.123000+1100')
 
         # One of those weird places with a half-hour offset timezone
-        self.flo.getTimezoneOffset = lambda when: 5400
-        self.assertEquals(self.flo.formatTime(when), '2001-02-03 02:35:06-0130')
+        self.flo.getTimezoneOffset = lambda when: 1800
+        self.assertEquals(self.flo.formatTime(when), '2001-02-03T03:35:06.123000-0030')
 
         # Half-hour offset in the other direction
-        self.flo.getTimezoneOffset = lambda when: -5400
-        self.assertEquals(self.flo.formatTime(when), '2001-02-03 05:35:06+0130')
+        self.flo.getTimezoneOffset = lambda when: -1800
+        self.assertEquals(self.flo.formatTime(when), '2001-02-03T04:35:06.123000+0030')
 
         # If a strftime-format string is present on the logger, it should
         # use that instead.  Note we don't assert anything about day, hour
