blob: a675907d1019ab85c34a02a7ee678137e5470943 [file] [log] [blame]
package atscfg
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
import (
"fmt"
"strconv"
"strings"
"github.com/apache/trafficcontrol/lib/go-tc"
)
const LoggingYAMLFileName = "logging.yaml"
const ContentTypeLoggingDotYAML = ContentTypeYAML
const LineCommentLoggingDotYAML = LineCommentHash
// LoggingDotYAMLOpts contains settings to configure generation options.
type LoggingDotYAMLOpts struct {
// HdrComment is the header comment to include at the beginning of the file.
// This should be the text desired, without comment syntax (like # or //). The file's comment syntax will be added.
// To omit the header comment, pass the empty string.
HdrComment string
}
func MakeLoggingDotYAML(
server *Server,
serverParams []tc.Parameter,
opts *LoggingDotYAMLOpts,
) (Cfg, error) {
if opts == nil {
opts = &LoggingDotYAMLOpts{}
}
warnings := []string{}
requiredIndent := 0
if server.HostName == nil {
return Cfg{}, makeErr(warnings, "this server missing HostName")
}
if len(server.ProfileNames) == 0 {
return Cfg{}, makeErr(warnings, "this server missing Profile")
}
paramData, paramWarns := paramsToMap(filterParams(serverParams, LoggingYAMLFileName, "", "", "location"))
warnings = append(warnings, paramWarns...)
hdr := makeHdrComment(opts.HdrComment)
version, vWarn := getATSMajorVersion(serverParams)
warnings = append(warnings, vWarn...)
// note we use the same const as logs.xml - this isn't necessarily a requirement, and we may want to make separate variables in the future.
maxLogObjects := MaxLogObjects
text := hdr
if version >= 9 {
text += "\nlogging:"
requiredIndent += 2
}
indentSpaces := strings.Repeat(" ", requiredIndent)
text += "\n" + indentSpaces + "formats: \n"
for i := 0; i < maxLogObjects; i++ {
logFormatField := "LogFormat"
if i > 0 {
logFormatField += strconv.Itoa(i)
}
logFormatName := paramData[logFormatField+".Name"]
if logFormatName != "" {
format := paramData[logFormatField+".Format"]
if format == "" {
// TODO determine if the line should be excluded. Perl includes it anyway, without checking.
warnings = append(warnings, fmt.Sprintf("server '%v' profile has logging.yaml format '%v' Name Parameter but no Format Parameter. Setting blank Format!\n", *server.HostName, logFormatField))
}
text += indentSpaces + " - name: " + logFormatName + " \n"
text += indentSpaces + " format: '" + format + "'\n"
}
}
text += indentSpaces + "filters:\n"
for i := 0; i < maxLogObjects; i++ {
logFilterField := "LogFilter"
if i > 0 {
logFilterField += strconv.Itoa(i)
}
if logFilterName := paramData[logFilterField+".Name"]; logFilterName != "" {
filter := paramData[logFilterField+".Filter"]
if filter == "" {
// TODO determine if the line should be excluded. Perl includes it anyway, without checking.
warnings = append(warnings, fmt.Sprintf("server '%v' profile has logging.yaml filter '%v' Name Parameter but no Filter Parameter. Setting blank Filter!\n", *server.HostName, logFilterField))
}
logFilterType := paramData[logFilterField+".Type"]
if logFilterType == "" {
logFilterType = "accept"
}
text += indentSpaces + " - name: " + logFilterName + "\n"
text += indentSpaces + " action: " + logFilterType + "\n"
text += indentSpaces + " condition: " + filter + "\n"
}
}
var firstObject = true
for i := 0; i < maxLogObjects; i++ {
logObjectField := "LogObject"
if i > 0 {
logObjectField += strconv.Itoa(i)
}
if logObjectFilename := paramData[logObjectField+".Filename"]; logObjectFilename != "" {
logObjectType := paramData[logObjectField+".Type"]
if logObjectType == "" {
logObjectType = "ascii"
}
logObjectFormat := paramData[logObjectField+".Format"]
logObjectRollingEnabled := paramData[logObjectField+".RollingEnabled"]
logObjectRollingIntervalSec := paramData[logObjectField+".RollingIntervalSec"]
logObjectRollingOffsetHr := paramData[logObjectField+".RollingOffsetHr"]
logObjectRollingSizeMb := paramData[logObjectField+".RollingSizeMb"]
logObjectFilters := paramData[logObjectField+".Filters"]
if firstObject {
text += "\n" + indentSpaces + "logs:\n"
firstObject = false
}
text += indentSpaces + " - mode: " + logObjectType + "\n"
text += indentSpaces + " filename: " + logObjectFilename + "\n"
text += indentSpaces + " format: " + logObjectFormat + "\n"
if logObjectType != "pipe" {
if logObjectRollingEnabled != "" {
text += indentSpaces + " rolling_enabled: " + logObjectRollingEnabled + "\n"
}
if logObjectRollingIntervalSec != "" {
text += indentSpaces + " rolling_interval_sec: " + logObjectRollingIntervalSec + "\n"
}
if logObjectRollingOffsetHr != "" {
text += indentSpaces + " rolling_offset_hr: " + logObjectRollingOffsetHr + "\n"
}
if logObjectRollingSizeMb != "" {
text += indentSpaces + " rolling_size_mb: " + logObjectRollingSizeMb + "\n"
}
}
if logObjectFilters != "" {
logObjectFilters = strings.Replace(logObjectFilters, "\v", "", -1)
text += indentSpaces + " filters: [" + logObjectFilters + "]\n"
}
}
}
return Cfg{
Text: text,
ContentType: ContentTypeLoggingDotYAML,
LineComment: LineCommentLoggingDotYAML,
Warnings: warnings,
}, nil
}