1515from __future__ import absolute_import
1616import sys
1717
18+ from io import TextIOWrapper , TextIOBase
19+ from splunklib .six import ensure_text
1820from .event import ET
1921
2022try :
2426
2527class EventWriter (object ):
2628 """``EventWriter`` writes events and error messages to Splunk from a modular input.
27-
2829 Its two important methods are ``writeEvent``, which takes an ``Event`` object,
2930 and ``log``, which takes a severity and an error message.
3031 """
@@ -42,8 +43,15 @@ def __init__(self, output = sys.stdout, error = sys.stderr):
4243 :param output: Where to write the output; defaults to sys.stdout.
4344 :param error: Where to write any errors; defaults to sys.stderr.
4445 """
45- self ._out = output
46- self ._err = error
46+ if isinstance (output , TextIOBase ):
47+ self ._out = output
48+ else :
49+ self ._out = TextIOWrapper (output )
50+
51+ if isinstance (error , TextIOBase ):
52+ self ._err = error
53+ else :
54+ self ._err = TextIOWrapper (error )
4755
4856 # has the opening <stream> tag been written yet?
4957 self .header_written = False
@@ -55,20 +63,18 @@ def write_event(self, event):
5563 """
5664
5765 if not self .header_written :
58- self ._out .write (b "<stream>" )
66+ self ._out .write (ensure_text ( "<stream>" ) )
5967 self .header_written = True
6068
6169 event .write_to (self ._out )
6270
6371 def log (self , severity , message ):
6472 """Logs messages about the state of this modular input to Splunk.
6573 These messages will show up in Splunk's internal logs.
66-
6774 :param severity: ``string``, severity of message, see severities defined as class constants.
6875 :param message: ``string``, message to log.
6976 """
70-
71- self ._err .write (("%s %s\n " % (severity , message )).encode ('utf-8' ))
77+ self ._err .write (ensure_text ("%s %s\n " % (severity , message )))
7278 self ._err .flush ()
7379
7480 def write_xml_document (self , document ):
@@ -77,9 +83,11 @@ def write_xml_document(self, document):
7783
7884 :param document: An ``ElementTree`` object.
7985 """
80- self ._out .write (ET .tostring (document ))
86+ data = ET .tostring (document )
87+ self ._out .write (ensure_text (data ))
8188 self ._out .flush ()
8289
8390 def close (self ):
8491 """Write the closing </stream> tag to make this XML well formed."""
85- self ._out .write (b"</stream>" )
92+ self ._out .write (ensure_text ("</stream>" ))
93+ self ._out .flush ()
0 commit comments