Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for configuration file settings #1

Closed
atc0005 opened this issue Aug 18, 2019 · 16 comments · Fixed by #156
Closed

Add support for configuration file settings #1

atc0005 opened this issue Aug 18, 2019 · 16 comments · Fixed by #156

Comments

@atc0005
Copy link
Owner

atc0005 commented Aug 18, 2019

While this tool will be heavily command-line driven, there are likely to be several good use cases for laying out all desired options via configuration file.

The specific format is yet to be determined.

Potential options:

  • YAML
  • JSON (not likely)
  • TOML (instead of INI)
  • flat, space-separated text file
@atc0005
Copy link
Owner Author

atc0005 commented Aug 18, 2019

flags-first package by Peter Bourgon supports all of these configuration file formats and command-line and environment variables.

https://github.com/peterbourgon/ff

@atc0005
Copy link
Owner Author

atc0005 commented Aug 22, 2019

integrii/flaggy#24 (comment)

This GitHub issue shows how to use Save() and Load() methods on a custom Config object to handle loading and saving a configuration file. The example then covers how to use the struct with the flaggy package to overwrite default configuration settings with user-specified flags (if provided).

If we're willing to use a JSON-formatted configuration file, we could have the app save the current settings chosen on command-line out to a configuration file, either with an automatic choice for save/load location or something custom provided by the user (maybe an enhancement to the first draft).

@atc0005
Copy link
Owner Author

atc0005 commented Sep 13, 2019

As noted on #2 (comment):

While researching logging, I saw that the https://github.com/spf13/viper package handles environment variables, config files and command-line flags. Using this package could tick-off multiple TODO items for this project.

@atc0005 atc0005 modified the milestones: v0.3.0, Future Sep 26, 2019
@atc0005
Copy link
Owner Author

atc0005 commented Oct 19, 2019

Aside from YAML, what other config file format easily support specifying multiple source paths to crawl/process?

@atc0005
Copy link
Owner Author

atc0005 commented Oct 20, 2019

Aside from YAML, what other config file format easily support specifying multiple source paths to crawl/process?

TOML seems like it would.

This appears to be the most active TOML library for Go:

https://github.com/pelletier/go-toml

This project's README (https://github.com/naoina/toml) gives an example of breaking array values over multiple lines, which I think would be a good fit for specifying multiple paths for processing:

# Line breaks are OK when inside arrays
hosts = [
  "alpha",
  "omega"
]

Presumably the line break support is a part of the TOML spec and would be supported by most/all Go library implementations for TOML.

@atc0005
Copy link
Owner Author

atc0005 commented Oct 20, 2019

Note to self: test both libraries:

Hands-on experience with both should make it easier to decide.

@atc0005
Copy link
Owner Author

atc0005 commented Oct 21, 2019

Note to self: test both libraries:

Takeaways thus far for TOML:

  • case-sensitive (I initially missed this)
  • pelletier/go-toml supports default values via the default struct tag (e.g., if a setting is missing from the config file)

Attempting to use default values may be tricky since we're also supporting command-line flags and environment variables.

@atc0005
Copy link
Owner Author

atc0005 commented Oct 21, 2019

Takeaways thus far for TOML:

  • case-sensitive (I initially missed this)

YAML is also case-sensitive.

@atc0005 atc0005 modified the milestones: Future, v0.4.1, v0.5.0, v0.6.0 Oct 22, 2019
@atc0005 atc0005 modified the milestones: v0.6.0, Future, v0.7.0 Oct 31, 2019
@atc0005
Copy link
Owner Author

atc0005 commented Nov 6, 2019

Scratch notes:

  • Separate config objects per config source

    • config object for flags
    • config object for config file
    • config object for ... ?
  • Separate NewConfig() from flags

    • LoadConfigFlags() (or another name) could apply flag settings to a config object for later merging with one or more other config objects

@atc0005
Copy link
Owner Author

atc0005 commented Nov 6, 2019

Create base config object, then copy it for use as a template with a new config source?

@atc0005
Copy link
Owner Author

atc0005 commented Nov 6, 2019

Note to self:

Comparing against a default:"" struct tag is problematic when the user explicitly opts to use that value.

Additionally, If the config file says to use json logging format, but the struct default says to use text and the args package uses that to configure its struct instance, how to tell whether the default from the struct was used vs a command-line flag or environment variable?

@atc0005
Copy link
Owner Author

atc0005 commented Nov 6, 2019

Does go-arg have logic that prevents using the default struct tag it the target struct already has a configured value?

go-toml does not, so that might be irrelevant?

@atc0005
Copy link
Owner Author

atc0005 commented Nov 7, 2019

At this point I've given up on trying to find a way to reliably keep the default struct tags in-place. While useful to have it appear in the help output, it allows the alexflint/go-arg and pelletier/go-toml packages to believe that they are the sole user of that field. This results in those packages assuming (perhaps rightly so) that if you didn't explicitly set a value, then the default tag on a struct field should be used to set/replace the value held in that field.

Thus if we try to use a layered configuration object approach with the default tags in place we lose any non-default settings applied from the "layer" beneath the current configuration object (e.g., processing flags after having just processed a config file).

In short, I think the default struct tags have to go for now.

@atc0005
Copy link
Owner Author

atc0005 commented Nov 7, 2019

Some other scratch notes from a brainstorming session (which probably didn't catch everything). As I write this I've found a few logic errors I still have to work out. Transcribing my existing notes anyway in case it helps me look at the problem from a different angle later.


  • Move default values back to constructor
    • context: the default struct tags currently used by alexflint/go-arg and pelletier/go-toml if found
  1. Process env files to load into env vars
  2. Create base config object
  3. Merge file config object
  4. Merge flags/env config object

MergeConfig() could have simpler logic:

  • if source struct field is non-zero, then overwrite dest struct field
    • I later attempted this by using a defaultConfig object for comparison instead of a non-zero value comparsion (gets rid of "magic" strings and numbers
    • If we apply config checks in order, this should work
  • the winning field is non-zero source field, otherwise existing destination field
    • note: this didn't work in practice initially until I made sure that the destination and source config structs were both fully initialized with intended default values (bug otherwise)
      -If default config is zero value and incoming config is zero value, we will do nothing and leave destination struct field as-is. This should result in a usable config object
    • as of this writing the branch I'm working with has odd behavior, so there is still some unaccounted for logic bugs somewhere

Config layering order:

  1. "default" config
  2. process env vars files
  3. config file object
  4. flags/env vars config object (e.g., alexflint/go-arg)

@atc0005
Copy link
Owner Author

atc0005 commented Nov 7, 2019

Still testing/working with my earlier approach. I'm starting to see some issues with the simple logic (e.g., copying slice values between structs), so I spent a short bit looking for community solutions to merging structs. Seems I'm far from the only one attempting to merge configuration settings across various structs, particularly from different configuration sources.

This package is used by quite a number of larger projects, including Kubernetes and Docker:

here are some (unsorted) examples of using it to merge different structs:

@atc0005
Copy link
Owner Author

atc0005 commented Nov 7, 2019

Still testing/working with my earlier approach. I'm starting to see some issues with the simple logic (e.g., copying slice values between structs), so I spent a short bit looking for community solutions to merging structs.

I'm not sure yet if the "stars aligned" or if I'm just fooling myself, but the current state of the associated feature branch appears to be working. I need to do further testing to make sure that config settings are being overridden as intended to establish the proper precedence.

atc0005 added a commit that referenced this issue Nov 11, 2019
- Add license info from go-toml project to NOTICE file
- Update README with precedence details
- Move `default` struct tag values back to
  constructor to improve compatibility between
  `pelletier/go-toml` and `alexflint/go-arg` packages
- Add TOML config file support
- Update doc comments
- Move logging config method to config package, break
  bulk of the code into separate functions called from
  the logging package
- Create `MergeConfig()` function to handle merging
  default, config file and command-line argument
  settings
  - needs work
  - good candidate for replacement by common
    struct merging package used by Docker, Kubernetes
    and others
- BUGFIX for "keep X files" logic (indexing out
  of bounds errors)
- BUGFIX: Fix logic problems with FileMatches slice indexing
- Various linting fixes
  - TODO: Problems created while adjusting code
    or existing issues fixed?
- Update .gitignore to ignore config.toml file
  in case user wishes to keep config file alongside
  of this code (for whatever reason)
- Update .gitignore to remove files no longer present
  or used
- BUGFIX for Config.String() method (field repeat?)
- config.Validate() now responsible for enforcing
  'required' settings in place of struct tags
- Extend doc comments for FileMatches sort methods
- Move FilesToPrune logic to FileMatches method in matches package
- Use logging.LogBuffer to collect log messages for later
  replay once user-specified logging settings are in-place
- Change log level for Windows syslog attempt

refs #1
atc0005 added a commit that referenced this issue Nov 11, 2019
- Add license info from go-toml project to NOTICE file
- Update README with precedence details
- Move `default` struct tag values back to
  constructor to improve compatibility between
  `pelletier/go-toml` and `alexflint/go-arg` packages
- Add TOML config file support
- Update doc comments
- Move logging config method to config package, break
  bulk of the code into separate functions called from
  the logging package
- Create `MergeConfig()` function to handle merging
  default, config file and command-line argument
  settings
  - needs work
  - good candidate for replacement by common
    struct merging package used by Docker, Kubernetes
    and others
- BUGFIX for "keep X files" logic (indexing out
  of bounds errors)
- BUGFIX: Fix logic problems with FileMatches slice indexing
- Various linting fixes
  - TODO: Problems created while adjusting code
    or existing issues fixed?
- Update .gitignore to ignore config.toml file
  in case user wishes to keep config file alongside
  of this code (for whatever reason)
- Update .gitignore to remove files no longer present
  or used
- BUGFIX for Config.String() method (field repeat?)
- config.Validate() now responsible for enforcing
  'required' settings in place of struct tags
- Extend doc comments for FileMatches sort methods
- Move FilesToPrune logic to FileMatches method in matches package
- Use logging.LogBuffer to collect log messages for later
  replay once user-specified logging settings are in-place
- Change log level for Windows syslog attempt

refs #1, #154
atc0005 added a commit that referenced this issue Nov 12, 2019
- Add TOML config file support
  - by way of `pelletier/go-toml` package
  - Add `config.example.toml` template/starter file
- LICENCE
  - Add license info from go-toml project to NOTICE file
- README
  - Update with precedence details
  - Update with new config file options table that maps those
    settings back to the equivalent command-line flags
- Move `default` struct tag values back to
  constructor to improve compatibility between
  `pelletier/go-toml`, `alexflint/go-arg` (and potentially)
   other packages
- Update many doc comments in an effort to expand coverage, improve
  clarity (lots more to do here)
- Move logging config method to config package, break
  bulk of the code into separate functions within the logging
  package that are now orchestrated from the
  `Config.SetLoggerConfig()` method
- Create `MergeConfig()` function to handle merging
  default, config file and command-line argument
  settings
  - favors incoming config object, provided the source field being
    examined does not contain a default value
  - needs work
  - good candidate for replacement by the `imdario/mergo` package
    used by Docker, Kubernetes, VMware and other big name projects
- BUGFIX: Fix logic problems with FileMatches slice indexing
- BUGFIX: Various linting fixes
- Update .gitignore to ignore config.toml file
  in case user wishes to keep config file alongside
  this code (for whatever reason)
- Update .gitignore to remove files no longer present
  or used
- BUGFIX for `Config.String()` method (field repeat?)
- Update `Config.Validate()` to assume full responsibility for
  enforcing 'required' settings in place of struct tags
- Extend doc comments for FileMatches sort methods
- Move FilesToPrune logic to FileMatches `FilesToPrune` method in
  matches package
- Use logging.LogBuffer to collect log messages for later
  replay once user-specified logging settings are in-place
- Change log level for Windows syslog attempt

refs #1, #154
atc0005 added a commit that referenced this issue Nov 12, 2019
- Add TOML config file support
  - by way of `pelletier/go-toml` package
  - Add `config.example.toml` template/starter file
- LICENCE
  - Add license info from go-toml project to NOTICE file
- README
  - Update with precedence details
  - Update with new config file options table that maps those
    settings back to the equivalent command-line flags
- Move `default` struct tag values back to
  constructor to improve compatibility between
  `pelletier/go-toml`, `alexflint/go-arg` (and potentially)
   other packages
- Update many doc comments in an effort to expand coverage, improve
  clarity (lots more to do here)
- Move logging config method to config package, break
  bulk of the code into separate functions within the logging
  package that are now orchestrated from the
  `Config.SetLoggerConfig()` method
- Create `MergeConfig()` function to handle merging
  default, config file and command-line argument
  settings
  - favors incoming config object, provided the source field being
    examined does not contain a default value
  - needs work
  - good candidate for replacement by the `imdario/mergo` package
    used by Docker, Kubernetes, VMware and other big name projects
- BUGFIX: Fix logic problems with FileMatches slice indexing
- BUGFIX: Various linting fixes
- Update .gitignore to ignore config.toml file
  in case user wishes to keep config file alongside
  this code (for whatever reason)
- Update .gitignore to remove files no longer present
  or used
- BUGFIX for `Config.String()` method (field repeat?)
- Update `Config.Validate()` to assume full responsibility for
  enforcing 'required' settings in place of struct tags
- Extend doc comments for FileMatches sort methods
- Move FilesToPrune logic to FileMatches `FilesToPrune` method in
  matches package
- Use logging.LogBuffer to collect log messages for later
  replay once user-specified logging settings are in-place
- Change log level for Windows syslog attempt

refs #1, #154
atc0005 added a commit that referenced this issue Nov 12, 2019
- Add TOML config file support
  - by way of `pelletier/go-toml` package
  - Add `config.example.toml` template/starter file
- LICENCE
  - Add license info from go-toml project to NOTICE file
- README
  - Update with precedence details
  - Update with new config file options table that maps those
    settings back to the equivalent command-line flags
  - Update log output examples to reflect no only config file
    command-line flags and related output, but also recent
    work to better summarize file size details (e.g., space
    reclaimed from pruning matching files)
- Move `default` struct tag values back to
  constructor to improve compatibility between
  `pelletier/go-toml`, `alexflint/go-arg` (and potentially)
   other packages
- Update many doc comments in an effort to expand coverage, improve
  clarity (lots more to do here)
- Move logging config method to config package, break
  bulk of the code into separate functions within the logging
  package that are now orchestrated from the
  `Config.SetLoggerConfig()` method
- Create `MergeConfig()` function to handle merging
  default, config file and command-line argument
  settings
  - favors incoming config object, provided the source field being
    examined does not contain a default value
  - needs work
  - good candidate for replacement by the `imdario/mergo` package
    used by Docker, Kubernetes, VMware and other big name projects
- BUGFIX: Fix logic problems with FileMatches slice indexing
- BUGFIX: Various linting fixes
- Update .gitignore to ignore config.toml file
  in case user wishes to keep config file alongside
  this code (for whatever reason)
- Update .gitignore to remove files no longer present
  or used
- BUGFIX for `Config.String()` method (field repeat?)
- Update `Config.Validate()` to assume full responsibility for
  enforcing 'required' settings in place of struct tags
- Extend doc comments for FileMatches sort methods
- Move FilesToPrune logic to FileMatches `FilesToPrune` method in
  matches package
- Use logging.LogBuffer to collect log messages for later
  replay once user-specified logging settings are in-place
- Change log level for Windows syslog attempt

refs #1, #154

WIP: Merge me
atc0005 added a commit that referenced this issue Nov 12, 2019
- Add TOML config file support
  - by way of `pelletier/go-toml` package
  - Add `config.example.toml` template/starter file
- LICENCE
  - Add license info from go-toml project to NOTICE file
- README
  - Update with precedence details
  - Update with new config file options table that maps those
    settings back to the equivalent command-line flags
  - Update log output examples to reflect no only config file
    command-line flags and related output, but also recent
    work to better summarize file size details (e.g., space
    reclaimed from pruning matching files)
- Move `default` struct tag values back to
  constructor to improve compatibility between
  `pelletier/go-toml`, `alexflint/go-arg` (and potentially)
   other packages
- Update many doc comments in an effort to expand coverage, improve
  clarity (lots more to do here)
- Move logging config method to config package, break
  bulk of the code into separate functions within the logging
  package that are now orchestrated from the
  `Config.SetLoggerConfig()` method
- Create `MergeConfig()` function to handle merging
  default, config file and command-line argument
  settings
  - favors incoming config object, provided the source field being
    examined does not contain a default value
  - needs work
  - good candidate for replacement by the `imdario/mergo` package
    used by Docker, Kubernetes, VMware and other big name projects
- BUGFIX: Fix logic problems with FileMatches slice indexing
- BUGFIX: Various linting fixes
- Update .gitignore to ignore config.toml file
  in case user wishes to keep config file alongside
  this code (for whatever reason)
- Update .gitignore to remove files no longer present
  or used
- BUGFIX for `Config.String()` method (field repeat?)
- Update `Config.Validate()` to assume full responsibility for
  enforcing 'required' settings in place of struct tags
- Extend doc comments for FileMatches sort methods
- Move FilesToPrune logic to FileMatches `FilesToPrune` method in
  matches package
- Use logging.LogBuffer to collect log messages for later
  replay once user-specified logging settings are in-place
- Change log level for Windows syslog attempt

refs #1, #154
atc0005 added a commit that referenced this issue Nov 12, 2019
- Add TOML config file support
  - by way of `pelletier/go-toml` package
  - Add `config.example.toml` template/starter file
- LICENCE
  - Add license info from go-toml project to NOTICE file
- README
  - Update with precedence details
  - Update with new config file options table that maps those
    settings back to the equivalent command-line flags
  - Update log output examples to reflect no only config file
    command-line flags and related output, but also recent
    work to better summarize file size details (e.g., space
    reclaimed from pruning matching files)
- Move `default` struct tag values back to
  constructor to improve compatibility between
  `pelletier/go-toml`, `alexflint/go-arg` (and potentially)
   other packages
- Update many doc comments in an effort to expand coverage, improve
  clarity (lots more to do here)
- Move logging config method to config package, break
  bulk of the code into separate functions within the logging
  package that are now orchestrated from the
  `Config.SetLoggerConfig()` method
- Create `MergeConfig()` function to handle merging
  default, config file and command-line argument
  settings
  - favors incoming config object, provided the source field being
    examined does not contain a default value
  - needs work
  - good candidate for replacement by the `imdario/mergo` package
    used by Docker, Kubernetes, VMware and other big name projects
- BUGFIX: Fix logic problems with FileMatches slice indexing
- BUGFIX: Various linting fixes
- Update .gitignore to ignore config.toml file
  in case user wishes to keep config file alongside
  this code (for whatever reason)
- Update .gitignore to remove files no longer present
  or used
- BUGFIX for `Config.String()` method (field repeat?)
- Update `Config.Validate()` to assume full responsibility for
  enforcing 'required' settings in place of struct tags
- Extend doc comments for FileMatches sort methods
- Move FilesToPrune logic to FileMatches `FilesToPrune` method in
  matches package
- Use logging.LogBuffer to collect log messages for later
  replay once user-specified logging settings are in-place
- Change log level for Windows syslog attempt

refs #1, #154
atc0005 added a commit that referenced this issue Nov 12, 2019
- Add TOML config file support
  - by way of `pelletier/go-toml` package
  - Add `config.example.toml` template/starter file
- LICENCE
  - Add license info from go-toml project to NOTICE file
- README
  - Update with precedence details
  - Update with new config file options table that maps those
    settings back to the equivalent command-line flags
  - Update log output examples to reflect no only config file
    command-line flags and related output, but also recent
    work to better summarize file size details (e.g., space
    reclaimed from pruning matching files)
- Move `default` struct tag values back to
  constructor to improve compatibility between
  `pelletier/go-toml`, `alexflint/go-arg` (and potentially)
   other packages
- Update many doc comments in an effort to expand coverage, improve
  clarity (lots more to do here)
- Move logging config method to config package, break
  bulk of the code into separate functions within the logging
  package that are now orchestrated from the
  `Config.SetLoggerConfig()` method
- Create `MergeConfig()` function to handle merging
  default, config file and command-line argument
  settings
  - favors incoming config object, provided the source field being
    examined does not contain a default value
  - needs work
  - good candidate for replacement by the `imdario/mergo` package
    used by Docker, Kubernetes, VMware and other big name projects
- BUGFIX: Fix logic problems with FileMatches slice indexing
- BUGFIX: Various linting fixes
- Update .gitignore to ignore config.toml file
  in case user wishes to keep config file alongside
  this code (for whatever reason)
- Update .gitignore to remove files no longer present
  or used
- BUGFIX for `Config.String()` method (field repeat?)
- Update `Config.Validate()` to assume full responsibility for
  enforcing 'required' settings in place of struct tags
- Extend doc comments for FileMatches sort methods
- Move FilesToPrune logic to FileMatches `FilesToPrune` method in
  matches package
- Use logging.LogBuffer to collect log messages for later
  replay once user-specified logging settings are in-place
- Change log level for Windows syslog attempt

refs #1, #154
atc0005 added a commit that referenced this issue Nov 13, 2019
- Add TOML config file support
  - by way of `pelletier/go-toml` package
  - Add `config.example.toml` template/starter file
- LICENCE
  - Add license info from go-toml project to NOTICE file
- README
  - Update with precedence details
  - Update with new config file options table that maps those
    settings back to the equivalent command-line flags
  - Update log output examples to reflect no only config file
    command-line flags and related output, but also recent
    work to better summarize file size details (e.g., space
    reclaimed from pruning matching files)
- Move `default` struct tag values back to
  constructor to improve compatibility between
  `pelletier/go-toml`, `alexflint/go-arg` (and potentially)
   other packages
- Update many doc comments in an effort to expand coverage, improve
  clarity (lots more to do here)
- Move logging config method to config package, break
  bulk of the code into separate functions within the logging
  package that are now orchestrated from the
  `Config.SetLoggerConfig()` method
- Create `MergeConfig()` function to handle merging
  default, config file and command-line argument
  settings
  - favors incoming config object, provided the source field being
    examined does not contain a default value
  - needs work
  - good candidate for replacement by the `imdario/mergo` package
    used by Docker, Kubernetes, VMware and other big name projects
- BUGFIX: Fix logic problems with FileMatches slice indexing
- BUGFIX: Various linting fixes
- Update .gitignore to ignore config.toml file
  in case user wishes to keep config file alongside
  this code (for whatever reason)
- Update .gitignore to remove files no longer present
  or used
- BUGFIX for `Config.String()` method (field repeat?)
- Update `Config.Validate()` to assume full responsibility for
  enforcing 'required' settings in place of struct tags
- Extend doc comments for FileMatches sort methods
- Move FilesToPrune logic to FileMatches `FilesToPrune` method in
  matches package
- Use logging.LogBuffer to collect log messages for later
  replay once user-specified logging settings are in-place
- Change log level for Windows syslog attempt

refs #1, #154
atc0005 added a commit that referenced this issue Nov 13, 2019
- Add TOML config file support
  - by way of `pelletier/go-toml` package
  - Add `config.example.toml` template/starter file
- LICENCE
  - Add license info from go-toml project to NOTICE file
- README
  - Update with precedence details
  - Update with new config file options table that maps those
    settings back to the equivalent command-line flags
  - Update log output examples to reflect no only config file
    command-line flags and related output, but also recent
    work to better summarize file size details (e.g., space
    reclaimed from pruning matching files)
- Move `default` struct tag values back to
  constructor to improve compatibility between
  `pelletier/go-toml`, `alexflint/go-arg` (and potentially)
   other packages
- Update many doc comments in an effort to expand coverage, improve
  clarity (lots more to do here)
- Move logging config method to config package, break
  bulk of the code into separate functions within the logging
  package that are now orchestrated from the
  `Config.SetLoggerConfig()` method
- Create `MergeConfig()` function to handle merging
  default, config file and command-line argument
  settings
  - favors incoming config object, provided the source field being
    examined does not contain a default value
  - needs work
  - good candidate for replacement by the `imdario/mergo` package
    used by Docker, Kubernetes, VMware and other big name projects
- BUGFIX: Fix logic problems with FileMatches slice indexing
- BUGFIX: Various linting fixes
- Update .gitignore to ignore config.toml file
  in case user wishes to keep config file alongside
  this code (for whatever reason)
- Update .gitignore to remove files no longer present
  or used
- BUGFIX for `Config.String()` method (field repeat?)
- Update `Config.Validate()` to assume full responsibility for
  enforcing 'required' settings in place of struct tags
- Extend doc comments for FileMatches sort methods
- Move FilesToPrune logic to FileMatches `FilesToPrune` method in
  matches package
- Use logging.LogBuffer to collect log messages for later
  replay once user-specified logging settings are in-place
- Change log level for Windows syslog attempt

refs #1, #154
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant