1 /*
2  * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  *
23  */
24 #ifndef SHARE_LOGGING_LOGFILESTREAMOUTPUT_HPP
25 #define SHARE_LOGGING_LOGFILESTREAMOUTPUT_HPP
26 
27 #include "logging/logDecorators.hpp"
28 #include "logging/logOutput.hpp"
29 #include "utilities/globalDefinitions.hpp"
30 
31 class LogDecorations;
32 
33 class LogFileStreamInitializer {
34  public:
35   LogFileStreamInitializer();
36 };
37 
38 // Ensure the default log streams have been initialized (stdout, stderr) using the static initializer below
39 static LogFileStreamInitializer log_stream_initializer;
40 
41 // Base class for all FileStream-based log outputs.
42 class LogFileStreamOutput : public LogOutput {
43  protected:
44   FILE*               _stream;
45   size_t              _decorator_padding[LogDecorators::Count];
46 
LogFileStreamOutput(FILE * stream)47   LogFileStreamOutput(FILE *stream) : _stream(stream) {
48     for (size_t i = 0; i < LogDecorators::Count; i++) {
49       _decorator_padding[i] = 0;
50     }
51   }
52 
53   int write_decorations(const LogDecorations& decorations);
54 
55  public:
56   virtual int write(const LogDecorations& decorations, const char* msg);
57   virtual int write(LogMessageBuffer::Iterator msg_iterator);
58 };
59 
60 class LogStdoutOutput : public LogFileStreamOutput {
61   friend class LogFileStreamInitializer;
62  private:
LogStdoutOutput()63   LogStdoutOutput() : LogFileStreamOutput(stdout) {
64     set_config_string("all=warning");
65   }
initialize(const char * options,outputStream * errstream)66   virtual bool initialize(const char* options, outputStream* errstream) {
67     return false;
68   }
69  public:
name() const70   virtual const char* name() const {
71     return "stdout";
72   }
73 };
74 
75 class LogStderrOutput : public LogFileStreamOutput {
76   friend class LogFileStreamInitializer;
77  private:
LogStderrOutput()78   LogStderrOutput() : LogFileStreamOutput(stderr) {
79     set_config_string("all=off");
80   }
initialize(const char * options,outputStream * errstream)81   virtual bool initialize(const char* options, outputStream* errstream) {
82     return false;
83   }
84  public:
name() const85   virtual const char* name() const {
86     return "stderr";
87   }
88 };
89 
90 extern LogStderrOutput &StderrLog;
91 extern LogStdoutOutput &StdoutLog;
92 
93 #endif // SHARE_LOGGING_LOGFILESTREAMOUTPUT_HPP
94