# Copyright (c) 2010 Flowerfire, Inc. All Rights Reserved. helix_universal_style5 = { plugin_version = "1.4" info.1.manfacturer = "Real Networks" info.1.device = "Helix Server Style 5" info.1.version.1 = "Style 5" # 2006-11-08 - MSG - Changed the display_format_type from milliseconds to compact [for sent_time field]. # Documentation from Helix # (http://service.real.com/help/library/guides/helixuniversalproxy/htmfiles/tracking.htm) # defines the sent_time as "seconds". [Moved comment from numerical fields section. - KBB] # 2007-10-08 - GMF - 1.1 - Changed 'received" and "failed resends" fields to float, # to handle larger values. # 2008-03-26 - KBB - 1.2 - Fixed a bug in the parsing regular expression where the report of multiple # Stats or square brackets in the client_info field would cause the entry to be rejected. # 2008-03-27 - KBB - 1.3 - Changed display_format_type from duration_milliseconds to duration_compact # for the file_time field which is also described in the document as being in seconds. # 2010-10-05 - 1.4 - MSG - Edited info lines. # The name of the log format log.format.format_label = "Helix Universal Server (Style 5) Log Format" log.miscellaneous.log_data_type = "http_access" log.miscellaneous.log_format_type = "media_server" # The log is in this format if any of the first ten lines match this regular expression log.format.autodetect_regular_expression = '^[0-9.]+ [^ ]+ [^ ]+ \\[[0-9]+/[A-Z][a-z][a-z]/[0-9]+:[0-9]+:[0-9]+:[0-9]+ [-+][0-9]+\\] *"[A-Z]+ [^ ]+ [^"]+" [0-9]+ [0-9]+ \\[[^]]*\\] \\[[^]]*\\] \\[.*\\] [0-9]+ [0-9]+ [0-9]+ [0-9]+ [0-9]+ [0-9]+$' # This expression is used to parse the data #log.format.parsing_regular_expression = '^([0-9.]+) [^ ]+ ([^ ]+) \\[([0-9]+/[A-Z][a-z][a-z]/[0-9]+:[0-9]+:[0-9]+:[0-9]+) [-+][0-9]+\\] *"([A-Z]+) ([^ ]*) ([^"]+)" ([0-9]+) ([0-9]+) \\[([^]]*)\\] \\[([^]]*)\\] \\[([^]]*)\\] ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)$' #99.99.99.99 - - [26/Feb/2008:19:53:52 -0600] "GET hello/goodbye/ciao.rm HTTP/1.0" 200 369 [Mozilla/4.0 (compatible;MSIE 7.0;Windows NT 5.1;TaxWise22.02[0004];TaxWise22.04[0003];.NET CLR 1.1.4322;.NET CLR 2.0.50727)] [] [UNKNOWN] 172 0 0 0 0 24475 #99.99.99.99 - - [26/Feb/2008:19:54:06 -0600] "GET hello/goodbye.rm?ciao=aloha RTSP/1.0" 200 279870 [WinNT_5.1_6.0.12.1483_RealPlayer_RN30BB_en-US_UNK] [51fb5ec0-7b2c-44d5-ad14-40bacfee8034] [Stat1: 103 0 0 0 0 32_Kbps_-_RealAudio][Stat2: 32041 60794 0 0 0 0 0 0 0 0 110 32_Kbps_-_RealAudio][Stat3:1766|0|Resume|;8156|4168|STOP|;] 414339580 9772 7 0 0 24477 log.format.parsing_regular_expression = '^([0-9.]+) [^ ]+ ([^ ]+) \\[([0-9]+/[A-Z][a-z][a-z]/[0-9]+:[0-9]+:[0-9]+:[0-9]+) [-+][0-9]+\\] *"([A-Z]+) ([^ ]*) ([^"]+)" ([0-9]+) ([0-9]+) \\[(.*)\\] \\[([^]]*)\\] \\[(.*)\\] ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)$' # Treat fields surrounded by square brackets (e.g. the date/time field) as a single quoted field. log.format.treat_brackets_as_quotes = "true" # The format of dates and times in this log log.format.date_format = "dd/mmm/yyyy:hh:mm:ss" log.format.time_format = "dd/mmm/yyyy:hh:mm:ss" # Log fields - IP_address - - [timestamp] "GET filename protocol/version" HTTP_status_code bytes_sent [client_info] [client_ID] [client_stats_results] file_size file_time sent_time resends failed_resends presentation_id log.fields = { hostname = { label = "$lang_stats.field_labels.hostname" type = "host" hierarchy_dividers = "." left_to_right = false leading_divider = "false" } # hostname authenticated_user = { label = "$lang_stats.field_labels.authenticated_user" type = "flat" } # authenticated_user date_time = { label = "$lang_stats.field_labels.date_time" type = "date_time" hierarchy_dividers = "" left_to_right = false leading_divider = "false" } # date_time operation = { label = "$lang_stats.field_labels.operation" type = "flat" } # operation file = { label = "$lang_stats.field_labels.file" type = "page" hierarchy_dividers = "/?" left_to_right = true leading_divider = "true" } # file protocol = { label = "$lang_stats.field_labels.protocol" type = "flat" } # protocol server_response = { label = "$lang_stats.field_labels.server_response" type = "response" hierarchy_dividers = "" left_to_right = false leading_divider = "false" } # server_response bytes_sent = { label = "$lang_stats.field_labels.bytes_sent" type = "size" hierarchy_dividers = "" left_to_right = false leading_divider = "false" } # bytes_sent # Client Info - OS/Player Type etc client_info = { label = "$lang_stats.field_labels.client_info" type = "flat" } # client_info # Client ID - Unique Player ID client_id = { label = "$lang_stats.field_labels.client_id" type = "flat" } # client_id # Client Stats Results - Client statistics (stat 1,2,3 and 4) client_stats_results = { label = "$lang_stats.field_labels.client_stats_results" type = "flat" } # client_stats_results file_size = { label = "$lang_stats.field_labels.file_size" type = "integer" } # file_size file_time = { label = "$lang_stats.field_labels.file_time" type = "integer" } # file_time sent_time = { label = "$lang_stats.field_labels.sent_time" type = "integer" } # sent_time resends = { label = "$lang_stats.field_labels.resends" type = "integer" } # resends received = { label = "$lang_stats.field_labels.received" type = "integer" } # received failed_resends = { label = "$lang_stats.field_labels.failed_resends" type = "integer" } # failed_resends presentation_id = { label = "$lang_stats.field_labels.presentation_id" type = "integer" } # presentation_id version = { label = "$lang_stats.field_labels.version" type = "flat" } # version client = { label = "$lang_stats.field_labels.client" type = "flat" } # client type = { label = "$lang_stats.field_labels.type" type = "flat" } # type distribution = { label = "$lang_stats.field_labels.distribution" type = "flat" } # distribution language = { label = "$lang_stats.field_labels.language" type = "flat" } # language cpu = { label = "$lang_stats.field_labels.cpu" type = "flat" } # cpu turboplay = { label = "$lang_stats.field_labels.turboplay" type = "flat" } # turboplay transport = { label = "$lang_stats.field_labels.transport" type = "flat" } # transport clip_end = { label = "$lang_stats.field_labels.clip_end" type = "flat" } # clip_end out_of_order = { label = "$lang_stats.field_labels.out_of_order" type = "flat" } # out_of_order missing = { label = "$lang_stats.field_labels.missing" type = "flat" } # missing early = { label = "$lang_stats.field_labels.early" type = "flat" } # early late = { label = "$lang_stats.field_labels.late" type = "flat" } # late bandwidth = { label = "$lang_stats.field_labels.bandwidth" type = "flat" } # bandwidth available = { label = "$lang_stats.field_labels.available" type = "flat" } # available highest = { label = "$lang_stats.field_labels.highest" type = "flat" } # highest lowest = { label = "$lang_stats.field_labels.lowest" type = "flat" } # lowest average = { label = "$lang_stats.field_labels.average" type = "flat" } # average requested = { label = "$lang_stats.field_labels.requested" type = "flat" } # requested rebuffering = { label = "$lang_stats.field_labels.rebuffering" type = "flat" } # rebuffering startup = { label = "$lang_stats.field_labels.startup" type = "flat" } # startup stream_number = { label = "$lang_stats.field_labels.stream_number" type = "flat" } # stream_number mime_type = { label = "$lang_stats.field_labels.mime_type" type = "flat" } # mime_type codec = { label = "$lang_stats.field_labels.codec" type = "flat" } # codec lost = { label = "$lang_stats.field_labels.lost" type = "flat" } # lost resent = { label = "$lang_stats.field_labels.resent" type = "flat" } # resent average_bandwidth = { label = "$lang_stats.field_labels.average_bandwidth" type = "flat" } # average_bandwidth current_bandwidth = { label = "$lang_stats.field_labels.current_bandwidth" type = "flat" } # current_bandwidth transport_protocol = { label = "$lang_stats.field_labels.transport_protocol" type = "flat" } # transport_protocol duration = { label = "$lang_stats.field_labels.duration" type = "flat" } # duration } # log.fields # Database fields database.fields = { date_time = { label = "$lang_stats.field_labels.date_time" log_field = "date_time" type = "string" suppress_top = 0 suppress_bottom = 3 display_format_type = "date_time" } # date_time day_of_week = { label = "$lang_stats.field_labels.day_of_week" log_field = "day_of_week" type = "string" suppress_top = 0 suppress_bottom = 2 display_format_type = "day_of_week" } # day_of_week hour_of_day = { label = "$lang_stats.field_labels.hour_of_day" log_field = "hour_of_day" type = "string" suppress_top = 0 suppress_bottom = 2 display_format_type = "hour_of_day" } # hour_of_day file = { label = "$lang_stats.field_labels.file" log_field = "file" type = "string" suppress_top = 0 suppress_bottom = 9 display_format_type = "page" } # file file_type = { label = "$lang_stats.field_labels.file_type" log_field = "file_type" type = "string" suppress_top = 0 suppress_bottom = 2 } # file_type hostname = { label = "$lang_stats.field_labels.hostname" log_field = "hostname" type = "string" suppress_top = 0 suppress_bottom = 2 display_format_type = "hostname" } # hostname domain_description = { label = "$lang_stats.field_labels.domain_description" log_field = "domain_description" type = "string" suppress_top = 0 suppress_bottom = 2 } # domain_description location = { label = "$lang_stats.field_labels.location" log_field = "location" type = "string" suppress_top = 0 suppress_bottom = 2 } # location protocol = { label = "$lang_stats.field_labels.protocol" log_field = "protocol" type = "string" suppress_top = 0 suppress_bottom = 2 } # protocol server_response = { label = "$lang_stats.field_labels.server_response" log_field = "server_response" type = "string" suppress_top = 0 suppress_bottom = 2 } # server_response # Client info section client_info = { label = "$lang_stats.field_labels.client_info" log_field = "client_info" type = "string" suppress_top = 0 suppress_bottom = 3 } # client_info version = { label = "$lang_stats.field_labels.version" log_field = "version" type = "string" suppress_top = 0 suppress_bottom = 3 } # version client = { label = "$lang_stats.field_labels.client" log_field = "client" type = "string" suppress_top = 0 suppress_bottom = 3 } # client type = { label = "$lang_stats.field_labels.type" log_field = "type" type = "string" suppress_top = 0 suppress_bottom = 3 } # type distribution = { label = "$lang_stats.field_labels.distribution" log_field = "distribution" type = "string" suppress_top = 0 suppress_bottom = 3 } # distribution language = { label = "$lang_stats.field_labels.language" log_field = "language" type = "string" suppress_top = 0 suppress_bottom = 3 } # language # Client ID client_id = { label = "$lang_stats.field_labels.client_id" log_field = "client_id" type = "string" suppress_top = 0 suppress_bottom = 2 } # client_id # Client stat results - type 1,2,3,4 transport = { label = "$lang_stats.field_labels.transport" log_field = "transport" type = "string" suppress_top = 0 suppress_bottom = 2 } # transport startup = { label = "$lang_stats.field_labels.startup" log_field = "startup" type = "string" suppress_top = 0 suppress_bottom = 2 } # startup # type 3 - not used at present by Sawmill # type 4 # stream info stream_number = { label = "$lang_stats.field_labels.stream_number" log_field = "stream_number" type = "string" suppress_top = 0 suppress_bottom = 2 } # stream_number mime_type = { label = "$lang_stats.field_labels.mime_type" log_field = "mime_type" type = "string" suppress_top = 0 suppress_bottom = 2 } # mime_type codec = { label = "$lang_stats.field_labels.codec" log_field = "codec" type = "string" suppress_top = 0 suppress_bottom = 2 } # codec transport_protocol = { label = "$lang_stats.field_labels.transport_protocol" log_field = "transport_protocol" type = "string" suppress_top = 0 suppress_bottom = 2 } # transport_protocol turboplay = { label = "$lang_stats.field_labels.turboplay" log_field = "turboplay" type = "string" suppress_top = 0 suppress_bottom = 2 } # turboplay clip_end = { label = "$lang_stats.field_labels.clip_end" log_field = "clip_end" type = "string" suppress_top = 0 suppress_bottom = 2 } # clip_end presentation_id = { label = "$lang_stats.field_labels.presentation_id" log_field = "presentation_id" type = "string" suppress_top = 0 suppress_bottom = 2 } # presentation_id } # database.fields # Log Filters log.filters = { cleanup_file = { label = "Clean up file" comment = "Handle empty file field" value = "if (matches_regular_expression(file, '^[A-Z]+/[0-9.]+$')) then file = ''" } # cleanup_file stat1 = { label = "Stat1" comment = "Extract stat1 subfields" value = "if (matches_regular_expression(client_stats_results, 'Stat1: +([0-9]+) +([0-9]+) +([0-9]+) +([0-9]+) +([0-9]+) +([^]]+)\\]')) then ( received = $1; out_of_order = $2; missing = $3; early = $4; late = $5; codec = $6 )" } # stat1 stat2 = { label = "Stat2" comment = "Extract Stat2 subfields" value = "if (matches_regular_expression(client_stats_results, '\\[Stat2: +([0-9]+) +([0-9]+) +([0-9]+) +([0-9]+) +([0-9]+) +([0-9]+) +([0-9]+) +([0-9]+) +([0-9]+) +([0-9]+) +([0-9]+) +([^]]+)')) then ( bandwidth = $1; available = $2; highest = $3; lowest = $4; average = $5; requested = $6; received = $7; late = $8; rebuffering = $9; transport = $10; startup = $11; codec = $12; )" } # stat2 stat4 = { label = "Stat4" comment = "Extract Stat4 subfields" value = "if (matches_regular_expression(client_stats_results, '\\[Stat4:([^|]+)\\|([^|]+)\\|([^|]+)\\|([^|]+)\\|([^|]+)\\|([^|]+)\\|([^|]+)\\|([^|]+)\\|([^|]+)\\|([^]]+)')) then ( stream_number = $1; mime_type = $2; codec = $3; received = $4; lost = $5; resent = $6; average_bandwidth = $7; current_bandwidth = $8; transport = $9; turboplay = $10; duration = $11; clip_end = $12; )" } # stat4 turboplay_1 = { label = "turboplay 1" comment = "" value = "if (starts_with(turboplay, '1')) then turboplay = '1'" } # turboplay_1 turboplay_2 = { label = "compute turboplay" comment = "" value = "turboplay = node_value(subnode_by_name('lang_stats.log_formats.helix_universal.turboplay', turboplay))" } # turboplay_2 transport = { label = "compute transport" comment = "" value = "transport = node_value(subnode_by_name('lang_stats.log_formats.helix_universal.transport', transport))" } # transport clip_end = { label = "extract clip_end" comment = "" value = "clip_end = node_value(subnode_by_name('lang_stats.log_formats.helix_universal.clip_end', clip_end))" # value = "clip_end = '$lang_stats.log_formats.helix_universal.clip_end.' . clip_end" } # clip_end cpu = { label = "cpu" comment = "Extract cpu subfields" value = "if (matches_regular_expression(cpu, '^([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)')) then ( client_info = $1; version = $2; client = $3; type = $4; distribution = $5; language = $6 )" } # cpu not_authenticated = { label = "$lang_admin.log_filters.not_authenticated_label" comment = "$lang_admin.log_filters.not_authenticated_comment" value = "if (authenticated_user eq '-') then authenticated_user = '(not authenticated)';" } # not_authenticated mark_entry = { label = '$lang_admin.log_filters.mark_entry_label' comment = '$lang_admin.log_filters.mark_entry_comment' value = 'clips = 1;' } # mark_entry } # log.filters log.field_options = { sessions_page_field = "file" # sessions_visitor_id_field = "client_id" sessions_visitor_id_field = "hostname" sessions_event_field = "clips" } # log.field_options database.numerical_fields = { clips = { label = "$lang_stats.field_labels.clips" default = true requires_log_field = false type = "int" display_format_type = "integer" entries_field = true } # clips visitors = { label = "$lang_stats.field_labels.visitors" default = false requires_log_field = true log_field = "client_id" type = "unique" display_format_type = "integer" } # visitors bytes_sent = { label = "$lang_stats.field_labels.bytes_sent" default = false requires_log_field = true log_field = "bytes_sent" type = "float" display_format_type = "bandwidth" } # bytes_sent file_size = { label = "$lang_stats.field_labels.file_size" default = false requires_log_field = true log_field = "file_size" type = "float" display_format_type = "bandwidth" } # file_size file_time = { label = "$lang_stats.field_labels.file_time" default = false requires_log_field = true log_field = "file_time" type = "int" display_format_type = "duration_compact" } # file_time sent_time = { label = "$lang_stats.field_labels.sent_time" default = false requires_log_field = true log_field = "sent_time" type = "int" display_format_type = "duration_compact" } # sent_time resends = { label = "$lang_stats.field_labels.resends" default = false requires_log_field = true log_field = "resends" type = "float" display_format_type = "integer" } # resends failed_resends = { label = "$lang_stats.field_labels.failed_resends" default = false requires_log_field = true log_field = "failed_resends" type = "float" display_format_type = "integer" } # failed_resends received = { label = "$lang_stats.field_labels.received" default = false requires_log_field = true log_field = "received" type = "float" display_format_type = "integer" } # received out_of_order = { label = "$lang_stats.field_labels.out_of_order" default = false requires_log_field = true log_field = "out_of_order" type = "int" display_format_type = "integer" } # out_of_order missing = { label = "$lang_stats.field_labels.missing" default = false requires_log_field = true log_field = "missing" type = "int" display_format_type = "integer" } # missing early = { label = "$lang_stats.field_labels.early" default = false requires_log_field = true log_field = "early" type = "int" display_format_type = "integer" } # early late = { label = "$lang_stats.field_labels.late" default = false requires_log_field = true log_field = "late" type = "int" display_format_type = "integer" } # late bandwidth = { label = "$lang_stats.field_labels.bandwidth" default = false requires_log_field = true log_field = "bandwidth" type = "float" display_format_type = "bandwidth" } # bandwidth available = { label = "$lang_stats.field_labels.available" default = false requires_log_field = true log_field = "available" type = "int" display_format_type = "integer" } # available highest = { label = "$lang_stats.field_labels.highest" default = false requires_log_field = true log_field = "highest" type = "int" display_format_type = "integer" } # highest lowest = { label = "$lang_stats.field_labels.lowest" default = false requires_log_field = true log_field = "lowest" type = "int" display_format_type = "integer" } # lowest average = { label = "$lang_stats.field_labels.average" default = false requires_log_field = true log_field = "average" type = "int" display_format_type = "integer" } # average requested = { label = "$lang_stats.field_labels.requested" default = false requires_log_field = true log_field = "requested" type = "int" display_format_type = "integer" } # requested rebuffering = { label = "$lang_stats.field_labels.rebuffering" default = false requires_log_field = true log_field = "rebuffering" type = "int" display_format_type = "integer" } # rebuffering resent = { label = "$lang_stats.field_labels.resent" default = false requires_log_field = true log_field = "resent" type = "float" display_format_type = "integer" } # resent lost = { label = "$lang_stats.field_labels.lost" default = false requires_log_field = true log_field = "lost" type = "int" display_format_type = "integer" } # lost average_bandwidth = { label = "$lang_stats.field_labels.average_bandwidth" default = false requires_log_field = true log_field = "average_bandwidth" type = "int" display_format_type = "integer" } # average_bandwidth current_bandwidth = { label = "$lang_stats.field_labels.current_bandwidth" default = false requires_log_field = true log_field = "current_bandwidth" type = "int" display_format_type = "integer" } # current_bandwidth duration = { label = "$lang_stats.field_labels.duration" default = false requires_log_field = true log_field = "duration" type = "int" display_format_type = "duration_milliseconds" } # duration } # database.numerical_fields create_profile_wizard_options = { # How the reports should be grouped in the report menu report_groups = { date_time_group = "" content_group = { file = true file_type = true } # content_group visitor_demographics_group = { hostname = true domain_description = true location = true } # visitor_demographics_group client_information_group = { client_info = true version = true client = true type = true distribution = true language = true cpu = true client_id = true } # client_info_group stream_information_group = { mime_type = true codec = true client_info = true version = true client = true type = true distribution = true language = true cpu = true codec = true transport = true startup = true clip_end = true stream_number = true } # stream_information other_group = { server_response = true protocol = true presentation_id = true turboplay = true transport_protocol = true } } # report_groups } # create_profile_wizard_options } # helix_universal_style5