# Copyright (c) 2010 Flowerfire, Inc. All Rights Reserved. edgecast = { plugin_version = "1.2" info.1.manufacturer = "Edgecast Networks" info.1.device = "Media server" info.1.version.1 = "" # 2010-03-02 - 1.0 - GMF - Initial creation # 2010-10-05 - 1.1 - MSG - Removed extra closing parenthesis from user_agent parsing filter. # 2012-09-25 - 1.1.1 - GMF - Added remove_query filter # 2012-09-25 - 1.2 - GMF - Added gateway_reports # The name of the log format log.format.format_label = "Edgecast Log Format" log.miscellaneous.log_data_type = "w3c" log.miscellaneous.log_format_type = "web_server" # The log is in this format if any of the first ten lines match this regular expression # e.g. Fields: timestamp time-taken c-ip filesize s-ip s-port sc-status sc-bytes cs-method cs-uri-stem - rs-duration rs-bytes c-referrer c-user-agent customer-id x-ec_custom-1 log.format.autodetect_regular_expression = "^#Fields: timestamp .* customer-id x-ec_custom-1" # The format of dates and times in this log log.format.date_format = "auto" log.format.time_format = "auto" # This format uses spaces between fields log.format.field_separator = " " # This handles #Fields lines, and creates log and database fields from them log.filter_preprocessor = ` if (matches_regular_expression(current_log_line(), '^#Fields: (.*)$')) then ( string fields = $1; string fieldname; v.logfieldindex = 1; string numerical_fields = "profiles." . internal.profile_name . ".database.numerical_fields"; # This subroutine creates a database field subroutine(create_database_field(string fieldname, int top, int bottom), ( #echo("create_database_field: " . fieldname); # debug debug_message("create_database_field(" . fieldname . ")\n"); string databasefieldpath = "profiles." . internal.profile_name . ".database.fields." . fieldname; (databasefieldpath . "") = ""; node databasefield = databasefieldpath; if (top ne 0) then set_subnode_value(databasefield, "suppress_top", top); if (bottom ne 0) then set_subnode_value(databasefield, "suppress_bottom", bottom); databasefield; )); subroutine(create_log_field(string fieldname, string type, bool withindex), ( debug_message("create_log_field(" . fieldname . "; type=" . type . ")\n"); string logfieldpath = "profiles." . internal.profile_name . ".log.fields." . fieldname; (logfieldpath . "") = ""; node logfield = logfieldpath; if (withindex) then ( set_subnode_value(logfield, "index", v.logfieldindex); v.logfieldindex++; ); set_subnode_value(logfield, "subindex", 0); if (type ne '') then set_subnode_value(logfield, "type", type); logfield; )); # Assume there isn't a localtime field until we see one. v.parse_localtime = false; # Extract the fields on at a time while (matches_regular_expression(fields, '^([^ ]+)[ ](.*)$')) ( string unconverted_fieldname = $1; fields = $2; # Clean up the field name fieldname = ''; for (int i = 0; i < length(unconverted_fieldname); i++) ( string c = lowercase(substr(unconverted_fieldname, i, 1)); if (!matches_regular_expression(c, '^[a-z0-9]$')) then c = '_'; fieldname .= c; ); while (matches_regular_expression(fieldname, '^(.*)_$')) fieldname = $1; # If fieldname is empty, this must be a "-" field in the header if (fieldname eq "") then fieldname = 'dash'; # Get the log field type string log_field_type = ''; if (fieldname eq 'c_referrer') then ( log_field_type = 'url'; ); else if (fieldname eq 'cs_uri_stem') then ( log_field_type = 'page'; ); else if (fieldname eq 'c_user_agent') then ( log_field_type = 'agent'; ); else if (fieldname eq 'c_ip') then ( log_field_type = 'host'; ); # Create the log field create_log_field(fieldname, log_field_type, true); # If we're creating a profile, create the database fields too. if (node_exists("volatile.creating_profile")) then ( # Handle timestamp by creating date_time and derived database fields if (fieldname eq "timestamp") then ( create_log_field('date', '', false); create_log_field('time', '', false); create_database_field('date_time', 0, 0); create_database_field('day_of_week', 0, 0); create_database_field('hour_of_day', 0, 0); ); # if timestamp # Create derived fields for agent else if (fieldname eq "c_user_agent") then ( create_database_field('operating_system', 0, 0); create_database_field('web_browser', 0, 0); create_database_field('spider', 0, 0); ); # Create database field cs_ip and derived field for client IP else if (fieldname eq "c_ip") then ( create_database_field('c_ip', 0, 0); create_database_field('location', 0, 0); ); # Create database field c_referrer and derived fields for referrer else if (fieldname eq "c_referrer") then ( create_database_field('c_referrer', 1, 9); create_database_field('search_engine', 0, 0); create_database_field('search_phrase', 0, 0); ); # Create derived file type field else if (fieldname eq "cs_uri_stem") then ( create_database_field('cs_uri_stem', 0, 9); create_database_field('file_type', 0, 0); ); # Don't add a database field for numerical fields else if (subnode_exists(numerical_fields, fieldname)) then ( debug_message("Not adding numerical field: " . fieldname . "\n"); ); # Don't add a database field for the "-" field else if (fieldname eq "dash") then ( ); # Create a normal database field else create_database_field(fieldname, 0, 0); ); # if creating profile ); # while another field # Don't parse the #Fields line as a data line 'reject'; ); # if #Fields # Don't parse any other # lines as data lines else if (starts_with(current_log_line(), '#')) then ( 'reject'; ); ` # Get search engine and search phrase information from the c_referrer field (before it gets simplified). log.parsing_filters.compute_se_sp = { value = `if (get_search_engine_info(c_referrer)) then ( search_engine = volatile.search_engine; search_phrase = volatile.search_phrase; ); ` requires_fields = { c_referrer = true } } # Get web browser, operating system, web browser, and spider information from the user-agent field. log.parsing_filters.derive_from_user_agent = { value = `get_user_agent_info(c_user_agent); web_browser = volatile.web_browser; operating_system = volatile.operating_system; spider = volatile.spider; ` requires_fields = { c_user_agent = true } } log.parsing_filters.parse_timestamp = ` date = normalize_date(timestamp, 'seconds_since_jan1_1970'); time = normalize_time(timestamp, 'seconds_since_jan1_1970'); ` # Log Filters log.filters = { #last_url_elements = { #label = "Last URL Elements" #comment = "Last URL Elements" #value = ` ##v.match = 'www.mydomain.com|mydirectory1|mydirectory2'; # Example ##v.N = "5"; # Example - up to six elements, including last ##v.N = ""; # Example - use with a pattern to include everything after the pattern #v.match = ""; #v.N = "0"; #if (matches_regular_expression(cs_uri_stem, '(' . v.match . ')[^/]*/(([^/]*/){0,' . v.N . '}[^/]*)$')) then ( #cs_uri_stem = $2; #); #` #disabled = "true" #} # last_url_elements # #customer_only = { #label = "Customer Only" #comment = "Reject all except customer's events" #value = `if (!contains(cs_uri_stem, "customer_name")) then "reject"` #disabled = "true" #} # customer_only simplify_referrer = { label = "$lang_admin.log_filters.simplify_referrer_label" comment = "$lang_admin.log_filters.simplify_referrer_comment" value = "if (c_referrer eq '-') then c_referrer = '(no referrer)' else if (matches_regular_expression(c_referrer, '^([^:]+://[^/]+/)')) then c_referrer = $1 . '(omitted)'" requires_fields = { c_referrer = true } } # simplify_referrer internal_referrer = { label = "$lang_admin.log_filters.internal_referrer_label" comment = "$lang_admin.log_filters.internal_referrer_comment" value = "if (contains(c_referrer, 'mydomain.com/')) then c_referrer = '(internal referrer)';" disabled = true requires_fields = { c_referrer = true } } # internal_referrer set_page_for_worm = { label = "$lang_admin.log_filters.set_page_for_worm_label" comment = "$lang_admin.log_filters.set_page_for_worm_comment" value = "if (starts_with(worm, '(')) then '' else cs_uri_stem = '(worm)';" requires_fields = { worm = true cs_uri_stem = true } } # set_page_for_worm # This filter tacks the page parameters ("URL query") onto the end of the page field empty_uri_query = { label = "$lang_admin.log_filters.empty_uri_query_label" comment = "$lang_admin.log_filters.empty_uri_query_comment" value = "if (cs_uri_query eq '-') then cs_uri_query = '(empty)';" disabled = true requires_fields = { cs_uri_query = true } } # empty_uri_query add_cs_uri_query = { label = "$lang_admin.log_filters.add_cs_uri_query_label" comment = "$lang_admin.log_filters.add_cs_uri_query_comment" value = "cs_uri_stem = cs_uri_stem . '?' . cs_uri_query" disabled = true requires_fields = { cs_uri_query = true cs_uri_stem = true } } # add_cs_uri_query remove_query = { label = "$lang_admin.log_filters.remove_query_label" comment = "$lang_admin.log_filters.remove_query_comment" value = "if (contains(cs_uri_stem, '?')) then cs_uri_stem = substr(cs_uri_stem, 0, index(cs_uri_stem, '?') + 1) . '(parameters)';" } # remove_query detect_page_views = { label = '$lang_admin.log_filters.detect_page_views_label' comment = '$lang_admin.log_filters.detect_page_views_comment' value = "if ((file_type eq 'JPEG') or (file_type eq 'JPG') or (file_type eq 'GIF') or (file_type eq 'ICO') or (file_type eq 'PNG') or (file_type eq 'CSS') or (file_type eq 'SWF') or (file_type eq 'JS')) then page_views = 0; else page_views = 1;" requires_fields = { file_type = true } } # detect_page_views strip_non_page_views = { label = '$lang_admin.log_filters.strip_non_page_views_label' comment = '$lang_admin.log_filters.strip_non_page_views_comment' value = "if (page_views == 0) then cs_uri_stem = substr(cs_uri_stem, 0, last_index(cs_uri_stem, '/') + 1) . '(nonpage)';" requires_fields = { cs_uri_stem = true } } # strip_non_page_views mark_entry = { label = '$lang_admin.log_filters.mark_entry_label' comment = '$lang_admin.log_filters.mark_entry_comment' value = 'hits = 1;' } # mark_entry } # log.filters database.numerical_fields = { hits = { label = "$lang_stats.field_labels.hits" default = false requires_log_field = false type = "int" display_format_type = "integer" entries_field = true } # hits page_views = { label = "$lang_stats.field_labels.page_views" default = true requires_log_field = false type = "int" display_format_type = "integer" } # page_views unique_client_ips = { label = "$lang_stats.field_labels.unique_client_ips" default = false requires_log_field = true log_field = "c_ip" type = "unique" display_format_type = "integer" } # unique_client_ips filesize = { label = "$lang_stats.field_labels.filesize" default = false requires_log_field = true log_field = "filesize" type = "int" integer_bits = 64 display_format_type = "bandwidth" } # filesize sc_bytes = { label = "$lang_stats.field_labels.sc_bytes" default = false log_field = "sc_bytes" requires_log_field = true type = "int" integer_bits = 64 display_format_type = "bandwidth" } rs_bytes = { requires_log_field = true type = "int" integer_bits = 64 display_format_type = "bandwidth" } rs_duration = { default = false requires_log_field = true type = float display_format_type = duration_compact } # rs_duration time_taken = { label = $lang_stats.field_labels.time_taken default = false requires_log_field = true type = float display_format_type = duration_milliseconds } # time_taken } # 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_type = true cs_uri_stem = true } visitor_demographics_group = { c_ip = true domain_description = true location = true organization = true isp = true domain = true } visitor_systems_group = { screen_dimensions = true screen_depth = true web_browser = true operating_system = true } referrer_group = { c_referrer = true search_engine = true search_phrase = true referrer_description = true search_phrase_by_search_engine = true } server_group = { s_sitename = true s_ip = true s_port = true } other_group = { worm = true spider = true cs_method = true sc_status = true customer_id = true x_ec_custom_1 = true } } # report_groups snapons = { # Attach a top_level_domain snapon top_level_domain = { snapon = "top_level_domain" name = "top_level_domain" label = "$lang_admin.snapons.top_level_domain.label" parameters = { url_field.parameter_value = "cs_uri_stem" field_name = { parameter_value = "$lang_admin.field_labels.top_level_domain" final_node_name = "top_level_domain" } } # parameters } # top_level_domain # Attach a gateway_reports snapon gateway_reports = { snapon = "gateway_reports" name = "gateway_reports" label = "$lang_admin.snapons.gateway_reports.label" parameters = { user_field.parameter_value = "c_ip" have_category_field.parameter_value = false # category_field.parameter_value = "category" host_field.parameter_value = "top_level_domain" page_views_field.parameter_value = "page_views" have_bytes_in_field.parameter_value = false # bytes_in_field.parameter_value = "size" sort_by_field.parameter_value = "page_views" } # parameters } # gateway_reports # 2013-02-06 - GMF - Now added in gateway_reports # # Add the standard reports # add_standard_reports = { # name = "add_standard_reports" # label = "add_standard_reports" # snapon = "add_standard_reports" # } # add_standard_reports } # snapons } # create_profile_wizard_options log.field_options = { sessions_page_field = "cs_uri_stem" sessions_visitor_id_field = "c_ip" sessions_event_field = "page_views" } # log.field_options } # edgecast