%% 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.

% Style guide for descriptions: Start with a lowercase letter & do not add
% a trailing full-stop / period
% Please keep this in alphabetical order

{[couch_log, level, critical], [
    {type, counter},
    {desc, <<"number of logged critical messages">>}
]}.
{[couch_log, level, debug], [
    {type, counter},
    {desc, <<"number of logged debug messages">>}
]}.
{[couch_log, level, emergency], [
    {type, counter},
    {desc, <<"number of logged emergency messages">>}
]}.
{[couch_log, level, error], [
    {type, counter},
    {desc, <<"number of logged error messages">>}
]}.
{[couch_log, level, info], [
    {type, counter},
    {desc, <<"number of logged info messages">>}
]}.
{[couch_log, level, notice], [
    {type, counter},
    {desc, <<"number of logged notice messages">>}
]}.
{[couch_log, level, warning], [
    {type, counter},
    {desc, <<"number of logged warning messages">>}
]}.
