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  }