# Copyright (c) 2020 Open Networking Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
#     http:#www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# input plugin to collect openolt logs
# formating the input logs using regex and creating a feilds such as level, instanceId, caller and msg.
<source>
  @id openolt.log
  @type tail
  path /var/log/openolt.log
  pos_file /var/log/td-agent/openolt.log.pos
  read_from_head true
  tag openolt
  <parse>
    @type multiline
    format_firstline /\[(\d+)(.\s+)(?<level>\w+)(?<instanceId>[\s]\w+)(\s+)\](?<caller>.\w+...\s\d+)(.\s)/
    format1 /\[(\d+)(.\s+)(?<level>\w+)(?<instanceId>[\s]\w+)(\s+)\](?<caller>.\w+...\s\d+)(.\s)(?<msg>.*)/
  </parse>
</source>

# Formating the `instanceId` field by concating with the device `Ip Address`.
# For example: If the extracted value for the field 'instanceId' is `OPENOLT` and `Ip` of the device is `192.x.x.x` after concating the
# `instanceId` will be  "OPENOLT-192.x.x.x"
# The log levels which are coming in the logs are like 'I', 'E' etc so replacing the log level 'I' to 'info', 'W' to 'warn' and 'E' to 'error'
<filter openolt.**>
  @type record_transformer
  enable_ruby true
  <record>
    instanceId ${record["instanceId"]}-${"#{(Socket.ip_address_list.detect do |intf| intf.ipv4_private? end).ip_address}"}
    level ${if record['level'] == 'I' then 'info' elsif record['level'] == 'W' then 'warn' else 'error'; end}
  </record>
</filter>

# input plugin to collect dev_mgmt_daemon logs
# formating the input logs using regex and creating a feilds such as level, instanceId, caller and msg.
<source>
  @id dev_mgmt_daemon.log
  @type tail
  path /var/log/dev_mgmt_daemon.log
  pos_file /var/log/td-agent/dev_mgmt_daemon.log.pos
  tag dev_mgmt
  read_from_head true
  <parse>
    @type multiline
    format_firstline /\[(\d+)(.\s+)(?<level>\w+)(?<instanceId>[\s]\w+)(\s+)\](?<caller>.\w+...\s\d+)(.\s)/
    format1 /\[(\d+)(.\s+)(?<level>\w+)(?<instanceId>[\s]\w+)(\s+)\](?<caller>.\w+...\s\d+)(.\s)(?<msg>.*)/
  </parse>
</source>

# Formating the `instanceId` field by concating with the device `Ip Address`.
# For example: If the extracted value for the field 'instanceId' is `SW_UTIL` and `Ip` of the device is `192.x.x.x` after concating the
# `instanceId` will be  "SW_UTIL-192.x.x.x"
# The log levels which are coming in the logs are like 'I', 'E' etc so replacing the log level 'I' to 'info', 'W' to 'warn' and 'E' to 'error'
<filter dev_mgmt.**>
  @type record_transformer
  enable_ruby true
  <record>
    instanceId ${record["instanceId"]}-${"#{(Socket.ip_address_list.detect do |intf| intf.ipv4_private? end).ip_address}"}
    level ${if record['level'] == 'I' then 'info' elsif record['level'] == 'W' then 'warn' else 'error'; end}
  </record>
</filter>

# input plugin to collect system logs
# formating the input logs using regex and creating a feilds such as host, caller and msg.
<source>
  @type syslog
  port 42185
  tag system
  format /(.*\S \d{1,2}:\d{1,2}:\d{1,2}.)(?<host>[^\s]\w+) (?<caller>[^\s][^:]+)(.)(?<msg>.*)/
</source>

<filter **>
  @type stdout
</filter>

# Output elasticsearch plugin
# provide host and port of elasticsearch
<match **>
  @id elasticsearch
  @type elasticsearch
  @log_level info
  include_tag_key true
  host localhost
  port 9200
  scheme http
  ssl_verify false
  logstash_format true
  reconnect_on_error true
  reload_on_failure false
  reload_connections false
  <buffer>
    @type file
    path /var/log/td-agent/buffer/elasticsearch
    flush_mode interval
    retry_type exponential_backoff
    flush_thread_count 8
    flush_interval 5s
    retry_max_interval 30
    chunk_limit_size 32MB
    queue_limit_length 8
    overflow_action block
  </buffer>
</match>
