diff --git a/manifests/init.pp b/manifests/init.pp index 1ef336af5..8767f78e1 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -122,7 +122,7 @@ Enum['on', 'off'] $http_tcp_nopush = 'off', $keepalive_timeout = '65s', $keepalive_requests = '100', - $log_format = {}, + Hash[String[1], Nginx::LogFormat] $log_format = {}, Boolean $mail = false, Variant[String, Boolean] $mime_types_path = 'mime.types', Boolean $stream = false, diff --git a/spec/classes/nginx_spec.rb b/spec/classes/nginx_spec.rb index 5e8f910b4..6af707464 100644 --- a/spec/classes/nginx_spec.rb +++ b/spec/classes/nginx_spec.rb @@ -544,11 +544,20 @@ attr: 'log_format', value: { 'format1' => 'FORMAT1', - 'format2' => 'FORMAT2' + 'format2' => 'FORMAT2', + 'format3' => { + 'format' => 'FORMAT3', + }, + 'format4' => { + 'escape' => 'json', + 'format' => '{"response": $status, "verb": "$request_method"}', + }, }, match: [ - ' log_format format1 \'FORMAT1\';', - ' log_format format2 \'FORMAT2\';' + ' log_format format1 "FORMAT1";', + ' log_format format2 "FORMAT2";', + ' log_format format3 "FORMAT3";', + ' log_format format4 escape=json "{\\"response\\": $status, \\"verb\\": \\"$request_method\\"}";' ] }, { diff --git a/templates/conf.d/nginx.conf.erb b/templates/conf.d/nginx.conf.erb index c19557ed3..fb6cb64b0 100644 --- a/templates/conf.d/nginx.conf.erb +++ b/templates/conf.d/nginx.conf.erb @@ -74,7 +74,11 @@ http { default_type application/octet-stream; <% if @log_format -%> <% @log_format.sort_by{|k,v| k}.each do |key,value| -%> - log_format <%= key %> '<%= value %>'; + <%- if value.is_a?(Hash) -%> + log_format <%= key %> <%= "escape=#{value['escape']} " if value['escape'] %><%= value['format'].inspect %>; + <%- else -%> + log_format <%= key %> <%= value.inspect %>; + <%- end -%> <% end -%> <% end -%> diff --git a/types/logformat.pp b/types/logformat.pp new file mode 100644 index 000000000..fcd6d5930 --- /dev/null +++ b/types/logformat.pp @@ -0,0 +1,7 @@ +type Nginx::LogFormat = Variant[ + String[1], + Struct[{ + Optional[escape] => Enum['default', 'json', 'none'], + format => String[1], + }], +]