github.com/go-spring/spring-base@v1.1.3/log/plugin_appender.go (about) 1 /* 2 * Copyright 2012-2019 the original author or authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * https://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package log 18 19 import ( 20 "context" 21 "os" 22 ) 23 24 func init() { 25 RegisterPlugin("Null", PluginTypeAppender, (*NullAppender)(nil)) 26 RegisterPlugin("Console", PluginTypeAppender, (*ConsoleAppender)(nil)) 27 RegisterPlugin("File", PluginTypeAppender, (*FileAppender)(nil)) 28 RegisterPlugin("RollingFile", PluginTypeAppender, (*RollingFileAppender)(nil)) 29 } 30 31 // Appender represents an output destination. 32 // Don't provide an asynchronous appender, because we have asynchronous logger. 33 type Appender interface { 34 LifeCycle 35 GetName() string 36 GetLayout() Layout 37 Append(e *Event) 38 } 39 40 var ( 41 _ Appender = (*NullAppender)(nil) 42 _ Appender = (*ConsoleAppender)(nil) 43 _ Appender = (*FileAppender)(nil) 44 _ Appender = (*RollingFileAppender)(nil) 45 ) 46 47 type BaseAppender struct { 48 Name string `PluginAttribute:"name"` 49 Layout Layout `PluginElement:"Layout,default=PatternLayout"` 50 } 51 52 func (c *BaseAppender) Start() error { return nil } 53 func (c *BaseAppender) Stop(ctx context.Context) {} 54 func (c *BaseAppender) GetName() string { return c.Name } 55 func (c *BaseAppender) GetLayout() Layout { return c.Layout } 56 57 // NullAppender is an Appender that ignores log events. 58 type NullAppender struct{} 59 60 func (c *NullAppender) Start() error { return nil } 61 func (c *NullAppender) Stop(ctx context.Context) {} 62 func (c *NullAppender) GetName() string { return "" } 63 func (c *NullAppender) GetLayout() Layout { return nil } 64 func (c *NullAppender) Append(e *Event) {} 65 66 // ConsoleAppender is an Appender that writing messages to os.Stdout. 67 type ConsoleAppender struct { 68 BaseAppender 69 } 70 71 func (c *ConsoleAppender) Append(e *Event) { 72 data, err := c.Layout.ToBytes(e) 73 if err != nil { 74 return 75 } 76 _, _ = os.Stdout.Write(data) 77 } 78 79 // FileAppender is an Appender writing messages to *os.File. 80 type FileAppender struct { 81 BaseAppender 82 writer Writer 83 FileName string `PluginAttribute:"fileName"` 84 } 85 86 func (c *FileAppender) Start() error { 87 w, err := Writers.Get(c.FileName, func() (Writer, error) { 88 return NewFileWriter(c.FileName) 89 }) 90 if err != nil { 91 return err 92 } 93 c.writer = w 94 return nil 95 } 96 97 func (c *FileAppender) Stop(ctx context.Context) { 98 Writers.Release(ctx, c.writer) 99 } 100 101 func (c *FileAppender) Append(e *Event) { 102 data, err := c.Layout.ToBytes(e) 103 if err != nil { 104 return 105 } 106 _, _ = c.writer.Write(data) 107 } 108 109 type RollingFileAppender struct { 110 BaseAppender 111 } 112 113 func (c *RollingFileAppender) Append(e *Event) { 114 115 }