// Code generated by protoc-gen-go.
// source: google/logging/type/log_severity.proto
// DO NOT EDIT!

package type_

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import _ "github.com/googleapis/proto-client-go/api"

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// The severity of the event described in a log entry.  These guideline severity
// levels are ordered, with numerically smaller levels treated as less severe
// than numerically larger levels. If the source of the log entries uses a
// different set of severity levels, the client should select the closest
// corresponding `LogSeverity` value. For example, Java's FINE, FINER, and
// FINEST levels might all map to `LogSeverity.DEBUG`. If the original severity
// code must be preserved, it can be stored in the payload.
//
type LogSeverity int32

const (
	// The log entry has no assigned severity level.
	LogSeverity_DEFAULT LogSeverity = 0
	// Debug or trace information.
	LogSeverity_DEBUG LogSeverity = 100
	// Routine information, such as ongoing status or performance.
	LogSeverity_INFO LogSeverity = 200
	// Normal but significant events, such as start up, shut down, or
	// configuration.
	LogSeverity_NOTICE LogSeverity = 300
	// Warning events might cause problems.
	LogSeverity_WARNING LogSeverity = 400
	// Error events are likely to cause problems.
	LogSeverity_ERROR LogSeverity = 500
	// Critical events cause more severe problems or brief outages.
	LogSeverity_CRITICAL LogSeverity = 600
	// A person must take an action immediately.
	LogSeverity_ALERT LogSeverity = 700
	// One or more systems are unusable.
	LogSeverity_EMERGENCY LogSeverity = 800
)

var LogSeverity_name = map[int32]string{
	0:   "DEFAULT",
	100: "DEBUG",
	200: "INFO",
	300: "NOTICE",
	400: "WARNING",
	500: "ERROR",
	600: "CRITICAL",
	700: "ALERT",
	800: "EMERGENCY",
}
var LogSeverity_value = map[string]int32{
	"DEFAULT":   0,
	"DEBUG":     100,
	"INFO":      200,
	"NOTICE":    300,
	"WARNING":   400,
	"ERROR":     500,
	"CRITICAL":  600,
	"ALERT":     700,
	"EMERGENCY": 800,
}

func (x LogSeverity) String() string {
	return proto.EnumName(LogSeverity_name, int32(x))
}
func (LogSeverity) EnumDescriptor() ([]byte, []int) { return fileDescriptor1, []int{0} }

func init() {
	proto.RegisterEnum("google.logging.type.LogSeverity", LogSeverity_name, LogSeverity_value)
}

var fileDescriptor1 = []byte{
	// 274 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x52, 0x4b, 0xcf, 0xcf, 0x4f,
	0xcf, 0x49, 0xd5, 0xcf, 0xc9, 0x4f, 0x4f, 0xcf, 0xcc, 0x4b, 0xd7, 0x2f, 0xa9, 0x2c, 0x00, 0x73,
	0xe2, 0x8b, 0x53, 0xcb, 0x52, 0x8b, 0x32, 0x4b, 0x2a, 0xf5, 0x0a, 0x8a, 0xf2, 0x4b, 0xf2, 0x85,
	0x84, 0x21, 0xea, 0xf4, 0xa0, 0xea, 0xf4, 0x40, 0xea, 0xa4, 0x64, 0xa0, 0x9a, 0x13, 0x0b, 0x32,
	0xf5, 0x13, 0xf3, 0xf2, 0xf2, 0x4b, 0x12, 0x4b, 0x32, 0xf3, 0xf3, 0x8a, 0x21, 0x5a, 0xb4, 0x9a,
	0x18, 0xb9, 0xb8, 0x7d, 0xf2, 0xd3, 0x83, 0xa1, 0x06, 0x09, 0x71, 0x73, 0xb1, 0xbb, 0xb8, 0xba,
	0x39, 0x86, 0xfa, 0x84, 0x08, 0x30, 0x08, 0x71, 0x72, 0xb1, 0xba, 0xb8, 0x3a, 0x85, 0xba, 0x0b,
	0xa4, 0x00, 0x99, 0x2c, 0x9e, 0x7e, 0x6e, 0xfe, 0x02, 0x27, 0x18, 0x81, 0x4a, 0xd8, 0xfc, 0xfc,
	0x43, 0x3c, 0x9d, 0x5d, 0x05, 0xd6, 0x30, 0x09, 0xf1, 0x70, 0xb1, 0x87, 0x3b, 0x06, 0xf9, 0x79,
	0xfa, 0xb9, 0x0b, 0x4c, 0x60, 0x16, 0xe2, 0xe2, 0x62, 0x75, 0x0d, 0x0a, 0xf2, 0x0f, 0x12, 0xf8,
	0xc2, 0x2c, 0xc4, 0xcb, 0xc5, 0xe1, 0x1c, 0xe4, 0x09, 0x54, 0xe7, 0xe8, 0x23, 0x70, 0x83, 0x05,
	0x24, 0xe5, 0xe8, 0xe3, 0x1a, 0x14, 0x22, 0xb0, 0x87, 0x55, 0x88, 0x8f, 0x8b, 0xd3, 0xd5, 0xd7,
	0x35, 0xc8, 0xdd, 0xd5, 0xcf, 0x39, 0x52, 0x60, 0x01, 0x9b, 0x53, 0x12, 0x97, 0x78, 0x72, 0x7e,
	0xae, 0x1e, 0x16, 0xd7, 0x3b, 0x09, 0x20, 0x39, 0x2e, 0x00, 0xe4, 0xe2, 0x00, 0xc6, 0x28, 0xe3,
	0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0x3d, 0xa0, 0x1e, 0x7d, 0x88, 0x1e, 0xa0, 0xdf, 0x8a, 0xf5,
	0xc1, 0x1e, 0xd2, 0x4d, 0xce, 0xc9, 0x4c, 0xcd, 0x2b, 0xd1, 0x4d, 0xcf, 0x47, 0x09, 0xad, 0xf8,
	0x24, 0x36, 0xb0, 0xb4, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x65, 0x4e, 0xff, 0x20, 0x4c, 0x01,
	0x00, 0x00,
}
